Condividi tramite


Con... Istruzione End With (Visual Basic)

Esegue una serie di istruzioni che fanno ripetutamente riferimento a un singolo oggetto o struttura in modo che le istruzioni possano utilizzare una sintassi semplificata quando si accede ai membri dell'oggetto o della struttura.

Sintassi

With objectExpression
    [ statements ]
End With

Parti

Termine Definizione
objectExpression Obbligatorio. Espressione che restituisce un oggetto . L'espressione può essere arbitrariamente complessa e viene valutata una sola volta. L'espressione può restituire qualsiasi tipo di dati, inclusi i tipi elementari.
statements Opzionale. Una o più istruzioni tra With e End With che possono fare riferimento ai membri di un oggetto prodotto dalla valutazione di objectExpression.
End With Obbligatorio. Termina la definizione del With blocco.

Osservazioni:

With...End WithUsando , è possibile eseguire più volte una serie di istruzioni su un oggetto specificato senza specificare il nome dell'oggetto più volte. All'interno di un With blocco di istruzioni è possibile specificare un membro dell'oggetto a partire da un punto, come se l'oggetto With istruzione lo precedesse.

Ad esempio, per modificare più proprietà in un singolo oggetto, posizionare le istruzioni di assegnazione di proprietà all'interno del With...End With blocco, facendo riferimento all'oggetto una sola volta anziché una sola volta per ogni assegnazione di proprietà.

Se il codice accede allo stesso oggetto in più istruzioni, si ottengono i vantaggi seguenti usando l'istruzione With :

  • Non è necessario valutare più volte un'espressione complessa o assegnare il risultato a una variabile temporanea per fare riferimento ai relativi membri più volte.

  • È possibile rendere il codice più leggibile eliminando le espressioni qualificanti ripetitive.

Il tipo di dati di può essere qualsiasi tipo di objectExpression classe o struttura o persino un tipo elementare di Visual Basic, Integerad esempio . Se objectExpression è una struttura, la possibilità di assegnare ai relativi membri dipende dal fatto che l'espressione di struttura sia referenziabile. È possibile assegnare ai membri di strutture a cui è direttamente possibile fare riferimento (ad esempio variabili, elementi di matrice o campi), ma si verifica un errore se si tenta di assegnare valori ai membri di strutture restituite dal valore da funzioni, proprietà o operatori o quando vengono usate parentesi per tagliare i legami di riferimento ,ad esempio With (structureVariable). Si tratta dello stesso errore che si otterrebbe se è stato richiamato un metodo che ha restituito una struttura ed è stato immediatamente eseguito l'accesso e l'assegnazione di un valore a un membro del risultato della funzione, ad esempio GetAPoint().x = 1. Il problema in entrambi i casi è che la struttura esiste solo nello stack di chiamate e non esiste alcun modo in cui un membro della struttura modificato in queste situazioni può scrivere in una posizione in modo che qualsiasi altro codice nel programma possa osservare la modifica.

L'oggetto objectExpression viene valutato una volta, al momento dell'ingresso nel blocco. Non è possibile riassegnare l'oggetto objectExpression dall'interno del With blocco.

All'interno di un With blocco è possibile accedere ai metodi e alle proprietà solo dell'oggetto specificato senza qualificarli. È possibile usare metodi e proprietà di altri oggetti, ma è necessario qualificarli con i relativi nomi di oggetto.

È possibile inserire un'istruzione With...End With all'interno di un'altra. Le istruzioni annidate With...End With possono generare confusione se gli oggetti a cui viene fatto riferimento non sono chiari dal contesto. È necessario fornire un riferimento completo a un oggetto che si trova in un blocco esterno With quando l'oggetto viene fatto riferimento dall'interno di un blocco interno With .

Non è possibile creare un ramo in un With blocco di istruzioni dall'esterno del blocco.

A meno che il blocco non contenga un ciclo, le istruzioni vengono eseguite una sola volta. È possibile annidare diversi tipi di strutture di controllo. Per altre informazioni, vedere Strutture di controllo annidate.

Annotazioni

È anche possibile usare la With parola chiave negli inizializzatori di oggetti. Per altre informazioni ed esempi, vedere Inizializzatori di oggetti: tipi denominati e anonimi e tipi anonimi.

Se si usa un With blocco solo per inizializzare le proprietà o i campi di un oggetto appena creato, è consigliabile usare un inizializzatore di oggetto.

Esempio 1

Nell'esempio seguente ogni With blocco esegue una serie di istruzioni su un singolo oggetto.

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

Esempio 2

Nell'esempio seguente sono annidate le With…End With istruzioni . All'interno dell'istruzione nidificata With , la sintassi fa riferimento all'oggetto interno.

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

Esempio 3

Nell'esempio seguente viene illustrato il With...End With funzionamento delle istruzioni con le strutture. È possibile assegnare ai membri di strutture a cui è possibile fare riferimento (ad esempio gli elementi della matrice), ma non alle strutture restituite dal valore o quando vengono usate le parentesi.

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

Vedere anche