Udostępnij za pomocą


Z... End with — Instrukcja (Visual Basic)

Wykonuje serię instrukcji, które wielokrotnie odwołują się do pojedynczego obiektu lub struktury, dzięki czemu instrukcje mogą używać uproszczonej składni podczas uzyskiwania dostępu do elementów członkowskich obiektu lub struktury.

Składnia

With objectExpression
    [ statements ]
End With

Części

Termin Definicja
objectExpression To jest wymagane. Wyrażenie, które oblicza obiekt. Wyrażenie może być dowolnie złożone i jest oceniane tylko raz. Wyrażenie może oceniać dowolny typ danych, w tym typy podstawowe.
statements Opcjonalny. Co najmniej jedna instrukcja między WithEnd With i może odnosić się do elementów członkowskich obiektu, który jest generowany przez ocenę objectExpressionelementu .
End With To jest wymagane. Kończy definicję With bloku.

Uwagi

Za pomocą polecenia With...End Withmożna wykonać serię instrukcji na określonym obiekcie bez wielokrotnego określania nazwy obiektu. With W bloku instrukcji można określić element członkowski obiektu rozpoczynający się od kropki, tak jakby With obiekt instrukcji go poprzedzał.

Aby na przykład zmienić wiele właściwości w jednym obiekcie, umieść instrukcje przypisania właściwości wewnątrz With...End With bloku, odwołując się do obiektu tylko raz, a nie raz dla każdego przypisania właściwości.

Jeśli kod uzyskuje dostęp do tego samego obiektu w wielu instrukcjach, uzyskasz następujące korzyści, korzystając z instrukcji With :

  • Nie musisz wielokrotnie oceniać wyrażenia złożonego ani przypisywać wyniku do zmiennej tymczasowej w celu odwoływania się do jej składowych wiele razy.

  • Kod staje się bardziej czytelny, eliminując powtarzające się wyrażenia kwalifikujące.

Typ danych może być dowolną objectExpression klasą lub typem struktury, a nawet typem podstawowym języka Visual Basic, takim jak Integer. Jeśli objectExpression jest strukturą, możliwość przypisania do jej elementów członkowskich zależy od tego, czy wyrażenie struktury jest możliwe do przywołowania. Można przypisać do elementów członkowskich struktur, które są bezpośrednio przywoływalne (takie jak zmienne, elementy tablicy lub pola), ale podczas próby przypisania wartości do elementów członkowskich struktur zwracanych przez wartość z funkcji, właściwości lub operatorów lub gdy nawiasy są używane do wycinania powiązań odwołań (na przykład With (structureVariable)). Jest to ten sam błąd, który można uzyskać, jeśli wywołano metodę, która zwróciła strukturę i natychmiast uzyskuje dostęp i przypisał wartość do elementu członkowskiego wyniku funkcji, na przykład GetAPoint().x = 1. Problem w obu przypadkach polega na tym, że struktura istnieje tylko na stosie wywołań i nie ma sposobu, w jaki zmodyfikowany element członkowski struktury w tych sytuacjach może zapisywać w lokalizacji, tak aby każdy inny kod w programie mógł obserwować zmianę.

Element objectExpression jest obliczany raz po wejściu do bloku. Nie można ponownie przypisać elementu objectExpression z bloku With .

With W bloku można uzyskać dostęp do metod i właściwości tylko określonego obiektu bez ich kwalifikacji. Można użyć metod i właściwości innych obiektów, ale należy je zakwalifikować przy użyciu ich nazw obiektów.

Można umieścić jedną With...End With instrukcję w innej. Zagnieżdżone With...End With instrukcje mogą być mylące, jeśli obiekty, do których się odwołujesz, nie są jasne z kontekstu. Należy podać w pełni kwalifikowane odwołanie do obiektu znajdującego się w bloku zewnętrznym With , gdy obiekt jest przywołyny z wewnątrz bloku wewnętrznego With .

Nie można rozgałęzić With bloku instrukcji spoza bloku.

Jeśli blok nie zawiera pętli, instrukcje są uruchamiane tylko raz. Można zagnieżdżać różne rodzaje struktur sterujących. Aby uzyskać więcej informacji, zobacz Zagnieżdżone struktury sterujące.

Uwaga / Notatka

Słowo kluczowe można również użyć With w inicjatorach obiektów. Aby uzyskać więcej informacji i przykładów, zobacz Inicjatory obiektów: typy nazwane i anonimowe i typy anonimowe.

Jeśli używasz With bloku tylko do inicjowania właściwości lub pól obiektu, który właśnie utworzono, rozważ użycie inicjatora obiektu.

Przykład 1

W poniższym przykładzie każdy With blok wykonuje serię instrukcji na pojedynczym obiekcie.

Private Sub AddCustomer()
    Dim theCustomer As New Customer

    With theCustomer
        .Name = "Coho Vineyard"
        .URL = "http://www.cohovineyard.com/"
        .City = "Redmond"
    End With

    With theCustomer.Comments
        .Add("First comment.")
        .Add("Second comment.")
    End With
End Sub

Public Class Customer
    Public Property Name As String
    Public Property City As String
    Public Property URL As String

    Public Property Comments As New List(Of String)
End Class

Przykład 2

Poniższe przykładowe instrukcje zagnieżdżają With…End With . W zagnieżdżonej With instrukcji składnia odwołuje się do obiektu wewnętrznego.

Dim theWindow As New EntryWindow

With theWindow
    With .InfoLabel
        .Content = "This is a message."
        .Foreground = Brushes.DarkSeaGreen
        .Background = Brushes.LightYellow
    End With

    .Title = "The Form Title"
    .Show()
End With

Przykład 3

W poniższym przykładzie pokazano, jak With...End With działają instrukcje ze strukturami. Można przypisać do elementów członkowskich struktur możliwych do odwołania (takich jak elementy tablicy), ale nie do struktur zwracanych przez wartość lub gdy są używane nawiasy.

Private Sub DemonstrateStructureWithStatement()
    ' Create an array of structures - this is referenceable
    Dim points(2) As Point

    ' Valid: Array elements are referenceable, so assignments work
    With points(0)
        .X = 10
        .Y = 20
    End With

    ' Create a single structure variable - this is also referenceable
    Dim singlePoint As Point
    With singlePoint
        .X = 30
        .Y = 40
    End With

    ' Invalid: Using parentheses cuts reference ties
    ' With (points(0))
    '     .X = 50  ' This would cause BC30068 error
    '     .Y = 60
    ' End With

    ' Invalid: Function returns by value, not referenceable
    ' With GetPoint()
    '     .X = 70  ' This would cause BC30068 error
    '     .Y = 80
    ' End With
End Sub

Private Function GetPoint() As Point
    Return New Point With {.X = 1, .Y = 2}
End Function

Private Structure Point
    Public X As Integer
    Public Y As Integer
End Structure

Zobacz także