Freigeben über


Mit... End With-Anweisung (Visual Basic)

Führt eine Reihe von Anweisungen aus, die wiederholt auf ein einzelnes Objekt oder eine einzelne Struktur verweisen, sodass die Anweisungen beim Zugriff auf Elemente des Objekts oder der Struktur eine vereinfachte Syntax verwenden können.

Syntax

With objectExpression
    [ statements ]
End With

Bestandteile

Begriff Definition
objectExpression Erforderlich. Ein Ausdruck, der zu einem Objekt ausgewertet wird. Der Ausdruck kann beliebig komplex sein und wird nur einmal ausgewertet. Der Ausdruck kann zu jedem beliebigen Datentyp ausgewertet werden, einschließlich elementarer Typen.
statements Wahlfrei. Eine oder mehrere Anweisungen zwischen With und End With denen sich auf Elemente eines Objekts beziehen kann, die von der Auswertung objectExpressionerstellt werden.
End With Erforderlich. Beendet die Definition des With Blocks.

Bemerkungen

Mithilfe von With...End With können Sie eine Reihe von Anweisungen für ein angegebenes Objekt ausführen, ohne den Namen des Objekts mehrmals anzugeben. Innerhalb eines With Anweisungsblocks können Sie ein Element des Objekts angeben, das mit einem Punkt beginnt, als ob ihm das With Anweisungsobjekt vorausging.

Wenn Sie z. B. mehrere Eigenschaften für ein einzelnes Objekt ändern möchten, platzieren Sie die Eigenschaftszuweisungsanweisungen innerhalb des With...End With Blocks, wobei sie nur einmal anstelle einer einzelnen Eigenschaftszuweisung auf das Objekt verweist.

Wenn Ihr Code in mehreren Anweisungen auf dasselbe Objekt zugreift, erhalten Sie die folgenden Vorteile mithilfe der With Anweisung:

  • Sie müssen einen komplexen Ausdruck nicht mehrmals auswerten oder einem temporären Variablen das Ergebnis zuweisen, um mehrmals auf seine Member zu verweisen.

  • Sie machen Ihren Code besser lesbar, indem sie sich wiederholende berechtigende Ausdrücke beseitigen.

Der Datentyp kann objectExpression ein beliebiger Klassen- oder Strukturtyp oder sogar ein Visual Basic-Elementartyp sein, z Integer. B. . Wenn objectExpression es sich um eine Struktur handelt, hängt die Möglichkeit zum Zuweisen der Member davon ab, ob der Strukturausdruck referenzierbar ist. Sie können Elemente von Strukturen zuweisen, die direkt referenzierbar sind (z. B. Variablen, Arrayelemente oder Felder), aber Sie erhalten einen Fehler, wenn Sie versuchen, Elemente von Strukturen zuzuweisen, die von Werten von Funktionen, Eigenschaften oder Operatoren zurückgegeben werden, oder wenn Klammern zum Ausschneiden von Bezugsbindungen verwendet werden (z With (structureVariable). B. ). Dies ist derselbe Fehler, den Sie erhalten würden, wenn Sie eine Methode aufgerufen haben, die eine Struktur zurückgegeben hat und sofort auf einen Wert zugegriffen und einem Element des Funktionsergebnisses, z GetAPoint().x = 1. B. , zugewiesen wurde. Das Problem in beiden Fällen besteht darin, dass die Struktur nur im Aufrufstapel vorhanden ist, und es gibt keine Möglichkeit, ein geändertes Strukturelement in diesen Situationen in einen Speicherort zu schreiben, sodass jeder andere Code im Programm die Änderung beobachten kann.

Die objectExpression Wird einmal ausgewertet, wenn Sie in den Block gelangen. Sie können den objectExpression Block With nicht neu zuweisen.

Innerhalb eines With Blocks können Sie nur auf die Methoden und Eigenschaften des angegebenen Objekts zugreifen, ohne sie zu qualifizieren. Sie können Methoden und Eigenschaften anderer Objekte verwenden, müssen sie jedoch mit ihren Objektnamen qualifizieren.

Sie können eine Anweisung innerhalb einer With...End With anderen platzieren. Geschachtelte With...End With Anweisungen können verwirrend sein, wenn die Objekte, auf die verwiesen wird, im Kontext nicht eindeutig sind. Sie müssen einen vollqualifizierten Verweis auf ein Objekt bereitstellen, das sich in einem äußeren With Block befindet, wenn auf das Objekt innerhalb eines inneren With Blocks verwiesen wird.

Sie können nicht von außerhalb des Blocks in einen With Anweisungsblock verzweigen.

Sofern der Block keine Schleife enthält, werden die Anweisungen nur einmal ausgeführt. Sie können verschiedene Arten von Steuerelementstrukturen verschachteln. Weitere Informationen finden Sie unter Geschachtelte Kontrollstrukturen.

Hinweis

Sie können auch das With Schlüsselwort in Objektinitialisierern verwenden. Weitere Informationen und Beispiele finden Sie unter Object Initializers: Named and Anonymous Types and Anonymous Types.

Wenn Sie einen With Block nur zum Initialisieren der Eigenschaften oder Felder eines Objekts verwenden, das Sie gerade instanziiert haben, sollten Sie stattdessen einen Objektinitialisierer verwenden.

Beispiel 1

Im folgenden Beispiel führt jeder With Block eine Reihe von Anweisungen für ein einzelnes Objekt aus.

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

Beispiel 2

Im folgenden Beispiel werden Anweisungen geschachtelt With…End With . Innerhalb der geschachtelten With Anweisung bezieht sich die Syntax auf das innere Objekt.

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

Beispiel 3

Im folgenden Beispiel wird veranschaulicht, wie With...End With Anweisungen mit Strukturen funktionieren. Sie können Elemente referenzierbarer Strukturen (z. B. Arrayelemente) zuweisen, aber nicht strukturen, die von Wert zurückgegeben werden oder wenn Klammern verwendet werden.

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

Siehe auch