Compartir a través de


Con... Instrucción End With (Visual Basic)

Ejecuta una serie de instrucciones que hacen referencia repetidamente a un único objeto o estructura para que las instrucciones puedan usar una sintaxis simplificada al acceder a los miembros del objeto o la estructura.

Sintaxis

With objectExpression
    [ statements ]
End With

Partes

Término Definición
objectExpression Obligatorio. Expresión que se evalúa como un objeto . La expresión puede ser arbitrariamente compleja y solo se evalúa una vez. La expresión puede evaluarse como cualquier tipo de datos, incluidos los tipos elementales.
statements Opcional. Una o varias instrucciones entre With y End With que pueden hacer referencia a miembros de un objeto generado por la evaluación de objectExpression.
End With Obligatorio. Finaliza la definición del With bloque.

Observaciones

With...End WithMediante , puede realizar una serie de instrucciones en un objeto especificado sin especificar el nombre del objeto varias veces. Dentro de un With bloque de instrucciones, puede especificar un miembro del objeto a partir de un punto, como si el objeto de With instrucción lo precedía.

Por ejemplo, para cambiar varias propiedades en un solo objeto, coloque las instrucciones de asignación de propiedades dentro del With...End With bloque, haciendo referencia al objeto solo una vez en lugar de una vez para cada asignación de propiedad.

Si el código tiene acceso al mismo objeto en varias instrucciones, obtendrá las siguientes ventajas mediante la With instrucción :

  • No es necesario evaluar varias veces una expresión compleja ni asignar el resultado a una variable temporal para hacer referencia a sus miembros varias veces.

  • Para que el código sea más legible, elimine las expresiones aptas repetitivas.

El tipo de datos de objectExpression puede ser cualquier clase o tipo de estructura o incluso un tipo elemental de Visual Basic, como Integer. Si objectExpression es una estructura, la capacidad de asignar a sus miembros depende de si se puede hacer referencia a la expresión de estructura. Puede asignar a miembros de estructuras a los que se puede hacer referencia directamente (como variables, elementos de matriz o campos), pero se produce un error si intenta asignar valores a los miembros de las estructuras que devuelve el valor de funciones, propiedades o operadores, o cuando se usan paréntesis para cortar los vínculos de referencia (por ejemplo, With (structureVariable)). Este es el mismo error que obtendría si invocaba un método que devolvía una estructura y accedía inmediatamente a un valor a un miembro del resultado de la función, como GetAPoint().x = 1. El problema en ambos casos es que la estructura solo existe en la pila de llamadas y no hay forma de que un miembro de estructura modificado en estas situaciones pueda escribir en una ubicación de modo que cualquier otro código del programa pueda observar el cambio.

objectExpression se evalúa una vez, tras la entrada en el bloque. No se puede reasignar desde objectExpression dentro del With bloque .

Dentro de un With bloque, puede acceder a los métodos y propiedades de solo el objeto especificado sin calificarlos. Puede usar métodos y propiedades de otros objetos, pero debe calificarlos con sus nombres de objeto.

Puede colocar una With...End With instrucción dentro de otra. Las instrucciones anidadas With...End With pueden resultar confusas si los objetos a los que se hace referencia no están claros del contexto. Debe proporcionar una referencia completa a un objeto que se encuentra en un bloque externo With cuando se hace referencia al objeto desde dentro de un bloque interno With .

No se puede bifurcar en un With bloque de instrucciones desde fuera del bloque.

A menos que el bloque contenga un bucle, las instrucciones se ejecutan solo una vez. Puede anidar diferentes tipos de estructuras de control. Para obtener más información, vea Estructuras de control anidadas.

Nota:

También puede usar la With palabra clave en inicializadores de objeto. Para obtener más información y ejemplos, vea Inicializadores de objetos: Tipos con nombre y anónimos y tipos anónimos.

Si usa un With bloque solo para inicializar las propiedades o campos de un objeto que acaba de crear instancias, considere la posibilidad de usar un inicializador de objeto en su lugar.

Ejemplo 1

En el ejemplo siguiente, cada With bloque ejecuta una serie de instrucciones en un solo 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

Ejemplo 2

En el ejemplo siguiente se anidan instrucciones With…End With . Dentro de la instrucción anidada With , la sintaxis hace referencia al 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

Ejemplo 3

En el ejemplo siguiente se muestra cómo With...End With funcionan las instrucciones con estructuras. Puede asignar a miembros de estructuras a las que se hace referencia (como los elementos de matriz), pero no a las estructuras devueltas por valor o cuando se usan paréntesis.

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 también