Поделиться через


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

См. также