跟。。。End With 语句 (Visual Basic)

执行一系列重复引用单个对象或结构的语句,以便语句在访问对象或结构的成员时可以使用简化的语法。

语法

With objectExpression
    [ statements ]
End With

部件

术语 定义
objectExpression 必填。 计算结果为对象的表达式。 表达式可能任意复杂,并且只计算一次。 表达式可计算为任何数据类型,包括基本类型。
statements 可选。 其中WithEnd With一个或多个语句可能引用由计算objectExpression生成的对象的成员。
End With 必填。 终止块的定义 With

注解

通过使用 With...End With,可以在指定对象上执行一系列语句,而无需多次指定对象的名称。 With在语句块中,可以指定以句点开头的对象的成员,就像With语句对象前面一样。

例如,若要更改单个对象的多个属性,请将属性赋值语句放在块中 With...End With ,只引用对象一次,而不是每个属性赋值一次。

如果代码访问多个语句中的同一对象,请使用该语句获得以下优势 With

  • 无需多次计算复杂表达式或将结果分配给临时变量以多次引用其成员。

  • 通过消除重复限定表达式,使代码更易于阅读。

objectExpression数据类型可以是任何类或结构类型,甚至是 Visual Basic 基本类型,例如Integer。 如果 objectExpression 为结构,则分配给其成员的能力取决于结构表达式是否可引用。 可以分配给直接可引用的结构的成员(如变量、数组元素或字段),但如果尝试向函数、属性或运算符返回的结构的成员赋值,或者使用括号剪切引用关系(例如, With (structureVariable))时,会收到错误。 如果调用返回结构的方法并立即访问并向其分配了函数结果的成员(例如 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

示例 3

以下示例演示语句如何使用 With...End With 结构。 可以分配给可引用结构(如数组元素)的成员,但不能分配给值返回的结构或使用括号时。

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

另请参阅