Istruzione With...End With (Visual Basic)

Esegue una serie di istruzioni che fanno riferimento più volte a un singolo oggetto o struttura in modo da poter utilizzare una sintassi semplificata per le istruzioni quando si accede ai membri dell'oggetto o della struttura. Quando si utilizza una struttura, è possibile leggere solo i valori dei membri o i metodi invoke e ottenere un errore se si tenta di assegnare valori ai membri di una struttura utilizzata in un'istruzione With...End With.

Sintassi

With objectExpression
    [ statements ]
End With

Parti

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

Osservazioni:

Utilizzando With...End With, è possibile eseguire una serie di istruzioni in un oggetto specificato senza specificare il nome dell'oggetto più volte. All'interno di un blocco di istruzioni With, è possibile specificare un membro dell'oggetto che inizia con un punto, come se l'oggetto dell'istruzione With lo precedesse.

Per modificare più proprietà in un singolo oggetto, ad esempio, è possibile inserire le istruzioni di assegnazione delle proprietà all'interno del blocco With...End With, facendo riferimento all'oggetto una sola volta anziché una volta per assegnazione di proprietà.

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

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

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

Il tipo di dati objectExpression può essere qualsiasi tipo di classe o struttura o anche un tipo elementare di Visual Basic come Integer. Se objectExpression restituisce qualcosa di diverso da un oggetto, è possibile leggere solo i valori dei membri o i metodi invoke e ottenere un errore se si tenta di assegnare valori ai membri di una struttura utilizzata in un'istruzione With...End With. Si tratta dello stesso errore che si otterrebbe se viene richiamato un metodo che restituisce una struttura e immediatamente si accede e si assegna un valore a un membro del risultato della funzione, come GetAPoint().x = 1. Il problema in entrambi i casi è che la struttura esiste solo nello stack di chiamate e in nessun caso un membro di una struttura modificata in tali situazioni può scrivere in una posizione in modo che altro codice del programma può osservare la modifica.

objectExpression viene valutato una volta, all'ingresso nel blocco. Non è possibile riassegnare objectExpression dall'interno del blocco With.

Dal blocco With, è possibile accedere ai metodi e alle proprietà del solo oggetto specificato senza qualifica. Metodi e proprietà di altri oggetti possono essere utilizzati ma è necessario qualificarli con i relativi nomi di oggetto.

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

Non è consentita la creazione di rami in un'istruzione With dall'esterno del blocco.

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

Nota

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

Se si utilizza un blocco With solo per inizializzare le proprietà o i campi di un oggetto di cui è stata appena creata un'istanza, è possibile utilizzare un inizializzatore di oggetto.

Esempio 1

Nell'esempio riportato di seguito, ogni blocco With 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 vengono annidate le istruzioni With…End With. Nell'istruzione With annidata, 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

Vedi anche