Compartilhar via


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 da estrutura.

Sintaxe

With objectExpression
    [ statements ]
End With

Partes

Prazo 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 instruções entre With e End With que podem se referir a membros de um objeto produzido pela avaliação de objectExpression.
End With Obrigatório Encerra a definição do With bloco.

Observações

Ao usar 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. Em um With bloco de instrução, você pode especificar um membro do objeto começando com um período, como se o objeto de instrução o With precedesse.

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 o código acessar o mesmo objeto em várias instruções, você obterá 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 pode ser qualquer tipo de objectExpression classe ou estrutura ou até mesmo um tipo elementar do Visual Basic, como Integer. Se objectExpression for uma estrutura, a capacidade de atribuir a seus membros depende se a expressão de estrutura é referenciada. Você pode atribuir a membros de estruturas que são referenciadas diretamente (como variáveis, elementos de matriz ou campos), mas receberá um erro se tentar atribuir valores a membros de estruturas retornadas por valor de funções, propriedades ou operadores ou quando parênteses são usados para cortar vínculos de referência (por exemplo, With (structureVariable)). Esse é o mesmo erro que você obteria se invocasse um método que retornasse uma estrutura e acessasse imediatamente e atribuisse 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á como um membro de estrutura modificado nessas situações poder gravar em um local de modo que qualquer outro código no programa possa observar a alteração.

O objectExpression valor é avaliado uma vez, após a entrada no bloco. Você não pode reatribuir o objectExpression de dentro do With bloco.

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

Você pode colocar uma With...End With instrução dentro de outra. Instruções aninhadas With...End With podem ser confusas se os objetos que estão sendo referenciados 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 .

Você não pode 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, confira Estruturas de controle aninhadas.

Observação

Você também pode usar a With palavra-chave em inicializadores de objeto. Para obter mais informações e exemplos, consulte Inicializadores de Objetos: 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 criar uma instância, 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 seguir aninha With…End With 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

Exemplo 3

O exemplo a seguir demonstra como With...End With as instruções funcionam com estruturas. Você pode atribuir a membros de estruturas referenciadas (como elementos de matriz), mas não a estruturas retornadas por valor ou quando parênteses são usados.

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

Consulte também