Оператор With... End With (Visual Basic)

Выполняет последовательность операторов, которые многократно ссылаются на единственный объект или структуру, чтобы операторы могли использовать упрощенный синтаксис доступ к членам объекта или структуры. При использовании структуры можно только считывать значения членов или вызвать методы. При попытке присвоения значений членам структуры, используемым в операторе With...End With, возникает ошибка.

Синтаксис

With objectExpression
    [ statements ]
End With

Детали

Термин Определение
objectExpression Обязательный. Выражение, результатом которого является объект. Выражение может быть произвольно сложным и вычисляется только один раз. Результатом выражения могут быть данные любого типа, включая простейшие типы.
statements Необязательно. Один или несколько операторов между With и End With, которые могут ссылаться на члены объекта, создаваемого при вычислении выражения objectExpression.
End With Обязательный. Завершает определение блока With.

Замечания

С помощью With...End With можно выполнять последовательность операторов с указанным объектом без необходимости многократного указания имени объекта. В блоке операторов With члены объекта можно указывать начиная с точки, как если бы перед ней стоял объект оператора With.

Например, чтобы изменить несколько свойств одного объекта, поместите операторы присваивания свойств внутрь блока With...End With и укажите объект лишь один раз, а не по одному разу для каждого свойства.

Если код обращается к одному и тому же объекту в нескольких операторах, оператор With обеспечивает следующие преимущества:

  • Не требуется многократно вычислять сложное выражение или присваивать результат временной переменной, чтобы несколько раз сослаться на членов объекта.

  • За счет исключения повторяющихся определяющих выражений код становится более понятным.

Тип данных у objectExpression может быть любым типом класса или структуры или даже простейшим типом Visual Basic (например Integer). При результат вычисления выражения objectExpression не является объектом, можно только считывать значения его членов или вызвать методы. При попытке присвоения значений членам структуры, используемым в операторе With...End With, возникает ошибка. Это та же самая ошибка, которая возникает, если сразу после вызова метода, возвращающего структуру, попытаться обратиться к члену результата функции и присвоить ему значение, например GetAPoint().x = 1. Проблема в обоих случаях заключается в том, что структура существует только в стеке вызовов — в таких ситуациях не существует способа записи измененного члена структуры в некоторое расположение таким образом, чтобы весь остальной код программы мог видеть это изменение.

Выражение objectExpression вычисляется один раз при входе в блок. Переназначение выражения objectExpression изнутри блока With невозможно.

Внутри блока With к методам и свойствам только указанного объекта можно обращаться без их полного описания. Можно использовать методы и свойства других объектов, однако необходимо полностью указывать их имена.

Оператор With...End With можно разместить внутри другого такого оператора. Вложенные операторы With...End With могут быть сложны для понимания, если указываемые объекты не очевидны из контекста. Необходимо указывать полную ссылку на объект, находящийся во внешнем блоке With, при ссылке на него из внутреннего блока With.

Переходы внутрь блока операторов With из другой части программы запрещены.

Если блок не содержит цикла, операторы выполняются только один раз. Возможно вложение структур управления различных типов. Дополнительные сведения см. в разделе "Вложенные структуры управления".

Примечание.

Ключевое слово With можно также использовать в инициализаторах объектов. Дополнительные сведения и примеры см. в разделе инициализаторы объектов: именованные и анонимные типы и анонимные типы.

Если блок With используется исключительно для инициализации свойств или полей только что созданного экземпляра объекта, рекомендуется использовать для этой цели инициализатор объекта.

Пример 1

В следующем примере в каждом блоке With выполняется несколько операторов для одного объекта.

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

Пример 2

В следующем примере показаны вложенные операторы With…End With: Во вложенном операторе With этот синтаксис относится к внутреннему объекту.

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

См. также