Оператор 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