Instrução With...End With (Visual Basic)
Executa uma série de instruções que referenciam repetidamente um único objeto ou estrutura de modo que as instruções possam usar uma sintaxe simplificada para acessar membros do objeto ou estrutura. Ao usar uma estrutura, você só poderá ler os valores dos membros ou invocar métodos, e obterá um erro se tentar atribuir valores aos membros de uma estrutura usada em uma instrução With...End With
.
Sintaxe
With objectExpression
[ statements ]
End With
Partes
Termo | Definição |
---|---|
objectExpression |
Obrigatórios. Uma expressão que avalia como um objeto. A expressão pode ser arbitrariamente complexa e é avaliada apenas uma vez. A expressão pode ser avaliada como qualquer tipo de dados, inclusive tipos elementares. |
statements |
Opcional. Uma ou mais instruções entre With e End With que podem fazer referência a membros de um objeto que é gerado pela avaliação de objectExpression . |
End With |
Obrigatórios. Finaliza a definição do bloco With . |
Comentários
Usando With...End With
, 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 bloco de instrução With
, você pode especificar um membro do objeto que começa com um ponto, como se o objeto de instrução With
o precedesse.
Por exemplo, para alterar várias propriedades diferentes em um único objeto, coloque as instruções de atribuição de propriedade dentro do bloco With...End With
, fazendo referência ao objeto apenas uma vez em vez de uma vez para cada atribuição de propriedade.
Se seu código acessar o mesmo objeto em várias instruções, você ganhará os seguintes benefícios usando a instrução With
:
Você não precisa avaliar várias vezes uma expressão complexa ou atribuir o resultado a uma variável temporária para fazer referência a seus membros várias vezes.
Você torna seu código mais legível eliminando expressões aplicáveis repetitivas.
O tipo de dados de objectExpression
pode ser qualquer tipo de classe ou estrutura, ou até mesmo um tipo elementar do 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 aos membros de uma estrutura usada em uma instrução With...End With
. Esse é 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 só existe na pilha de chamadas, e não há como um membro da estrutura alterada nessas situações gravar em um local de modo que qualquer outro código no programa possa observar a alteração.
objectExpression
é avaliada uma vez, ao entrar no bloco. Você não pode reatribuir objectExpression
de dentro do bloco With
.
Dentro de um bloco With
, você pode acessar os métodos e as propriedades de apenas o objeto especificado sem qualificá-los. Você pode usar métodos e propriedades de outros objetos, mas deverá qualificá-los com seus nomes de objeto.
Você pode colocar uma instrução With...End With
dentro de outra. As instruções With...End With
aninhadas podem ser confusas se os objetos que estão sendo referidos não são claros em termos de contexto. Você deve fornecer uma referência totalmente qualificada a um objeto que esteja em um bloco With
externo quando o objeto é referenciado dentro de um bloco With
interno.
Você não pode ramificar em uma instrução With
de fora do bloco.
A menos que o bloco contenha um loop, as instruções são executadas somente uma vez. Você pode aninhar diferentes tipos de estruturas de controle. Para obter mais informações, confira Estruturas de controle aninhadas.
Observação
Você também pode usar a palavra-chave With
em inicializadores de objetos. 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 bloco With
somente para inicializar as propriedades ou os campos de um objeto que acabou de instanciar, considere usar um inicializador do objeto como alternativa.
Exemplo 1
No exemplo a seguir, cada bloco With
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 seguir aninha instruções With…End With
. Na instrução With
aninhada, a sintaxe faz referência 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