Com... Instrução End With (Visual Basic)

Executa uma série de instruções que se referem repetidamente a um único objeto ou estrutura para que as instruções possam usar uma sintaxe simplificada ao acessar membros do objeto ou estrutura. Ao usar uma estrutura, você só pode ler os valores de membros ou invocar métodos, e você recebe um erro se tentar atribuir valores a membros de uma estrutura usada em uma With...End With instrução.

Sintaxe

With objectExpression
    [ statements ]
End With

Partes

Termo Definição
objectExpression Obrigatório. Uma expressão que é avaliada como um objeto. A expressão pode ser arbitrariamente complexa e é avaliada apenas uma vez. A expressão pode ser avaliada para qualquer tipo de dados, incluindo tipos elementares.
statements Opcional. Uma ou mais afirmações entre With e End With que podem referir-se a membros de um objeto que é produzido pela avaliação de objectExpression.
End With Obrigatório. Encerra a definição do With bloco.

Observações

With...End WithUsando o , você pode executar uma série de instruções em um objeto especificado sem especificar o nome do objeto várias vezes. Dentro de um With bloco de instrução, você pode especificar um membro do objeto começando com um ponto, como se o With objeto da instrução o precedisse.

Por exemplo, para alterar várias propriedades em um único objeto, coloque as instruções de atribuição de propriedade dentro do With...End With bloco , referindo-se ao objeto apenas uma vez em vez de uma vez para cada atribuição de propriedade.

Se seu código acessa o mesmo objeto em várias instruções, você obtém os seguintes benefícios usando a With instrução:

  • Você não precisa avaliar uma expressão complexa várias vezes ou atribuir o resultado a uma variável temporária para se referir a seus membros várias vezes.

  • Você torna seu código mais legível eliminando expressões de qualificação repetitivas.

O tipo de dados de pode ser qualquer classe ou tipo de estrutura ou até mesmo um tipo elementar do objectExpression Visual Basic, como Integer. Se objectExpression resultar em algo diferente de um objeto, você só poderá ler os valores de seus membros ou invocar métodos, e obterá um erro se tentar atribuir valores a membros de uma estrutura usada em uma With...End With instrução. Este é o mesmo erro que você obteria se invocasse um método que retornasse uma estrutura e imediatamente acessasse e atribuísse um valor a um membro do resultado da função, como GetAPoint().x = 1. O problema em ambos os casos é que a estrutura existe apenas na pilha de chamadas, e não há nenhuma maneira de um membro da estrutura modificado nessas situações pode escrever em um local tal que qualquer outro código no programa pode observar a mudança.

O objectExpression é avaliado uma vez, após a entrada no bloco. Não é possível reatribuir o objectExpression de dentro do With bloco.

Dentro de um With bloco , você pode acessar os métodos e propriedades de somente o objeto especificado sem qualificá-los. Você pode usar métodos e propriedades de outros objetos, mas deve qualificá-los com seus nomes de objeto.

Você pode colocar uma With...End With declaração dentro da outra. As instruções aninhadas With...End With podem ser confusas se os objetos aos quais estão sendo referidos não estiverem claros do contexto. Você deve fornecer uma referência totalmente qualificada a um objeto que está em um bloco externo With quando o objeto é referenciado de dentro de um bloco interno With .

Não é possível ramificar em um With bloco de instrução de fora do bloco.

A menos que o bloco contenha um loop, as instruções são executadas apenas uma vez. Você pode aninhar diferentes tipos de estruturas de controle. Para obter mais informações, consulte Estruturas de controle aninhadas.

Nota

Você também pode usar a With palavra-chave em inicializadores de objeto. Para obter mais informações e exemplos, consulte Inicializadores de objeto: tipos nomeados e anônimos e tipos anônimos.

Se você estiver usando um With bloco apenas para inicializar as propriedades ou campos de um objeto que acabou de instanciar, considere usar um inicializador de objeto.

Exemplo 1

No exemplo a seguir, cada With bloco executa uma série de instruções em um único objeto.

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

Exemplo 2

O exemplo a With…End With seguir aninha instruções. Dentro da instrução aninhada With , a sintaxe refere-se ao objeto 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

Consulte também