自动实现的属性 (Visual Basic)

自动实现的属性使你能够快速指定类的属性,而无需向和Set属性编写代码Get。 为自动实现的属性编写代码时,Visual Basic 编译器除了创建关联 GetSet 过程之外,还会自动创建一个专用字段来存储属性变量。

使用自动实现的属性,属性(包括默认值)可以在单行中声明。 下面的示例演示三个属性声明。

Public Property Name As String
Public Property Owner As String = "DefaultName"
Public Property Items As New List(Of String) From {"M", "T", "W"}
Public Property ID As New Guid()

自动实现的属性等效于一个属性,该属性的属性值存储在专用字段中。 下面的代码示例演示自动实现的属性。

Property Prop2 As String = "Empty"

下面的代码示例显示了上一个自动实现的属性示例的等效代码。

Private _Prop2 As String = "Empty"
Property Prop2 As String
    Get
        Return _Prop2
    End Get
    Set(ByVal value As String)
        _Prop2 = value
    End Set
End Property

以下代码演示如何实现只读属性:

Class Customer  
   Public ReadOnly Property Tags As New List(Of String)  
   Public ReadOnly Property Name As String = ""  
   Public ReadOnly Property File As String  
  
   Sub New(file As String)  
      Me.File = file  
   End Sub  
End Class  

可以使用初始化表达式分配给属性(如示例中所示),也可以在包含类型的构造函数中分配给属性。 可以随时分配给只读属性的支持字段。

支持字段

声明自动实现的属性时,Visual Basic 会自动创建一 个名为后盾字段的隐藏私有字段 来包含属性值。 后盾字段名称是自动实现的属性名称,前面是下划线(_)。 例如,如果声明了名为 ID“自动实现的属性”,则命名后盾字段 _ID。 如果包含一个也名为 _ID 的类成员,则会形成命名冲突,Visual Basic 会报告编译器错误。

支持字段还具有下列特征:

  • 支持字段的访问修饰符始终是 Private,即使在属性本身具有不同访问级别(如 Public)时也是如此。

  • 如果属性标记为 Shared,则支持字段也进行共享。

  • 为属性指定的属性不适用于支持字段。

  • 可以从类中的代码以及从调试工具(如监视窗口)访问支持字段。 但是,支持字段不显示在 IntelliSense 文字自动完成列表中。

初始化自动实现的属性

可用于初始化字段的任何表达式都可用于初始化自动实现的属性。 初始化自动实现的属性时,将计算表达式并将其传递给 Set 该属性的过程。 下面的代码示例显示了一些自动实现的属性,这些属性包括初始值。

Property FirstName As String = "James"
Property PartNo As Integer = 44302
Property Orders As New List(Of Order)(500)

不能初始化自动实现的属性,该属性是一个 Interface成员或标记 MustOverride的属性。

将自动实现的属性声明为成员 Structure时,仅当属性被标记为 Shared时,才能初始化自动实现的属性。

将自动实现的属性声明为数组时,不能指定显式数组边界。 但是,可以使用数组初始值设定项提供值,如下面的示例所示。

Property Grades As Integer() = {90, 73}
Property Temperatures As Integer() = New Integer() {68, 54, 71}

需要标准语法的属性定义

自动实现的属性很方便,支持许多编程方案。 但是,在某些情况下,不能使用自动实现的属性,必须改用标准或 扩展的属性语法。

如果要执行以下任一操作,则必须使用扩展属性定义语法:

  • 向属性的 GetSet 过程添加代码,如用于在 Set 过程中验证传入值的代码。 例如,你可能要在设置属性值之前验证表示电话号码的字符串是否包含所需数量的数字。

  • GetSet 过程指定不同的可访问性。 例如,你可能要使 Set 过程是 Private,要使 Get 过程是 Public

  • 创建作为 WriteOnly 的属性。

  • 使用参数化的属性(包括 Default 属性)。 必须声明扩展属性才能为属性指定参数或是为 Set 过程指定附加参数。

  • 将属性置于支持字段上,或更改支持字段的访问级别。

  • 为支持字段提供 XML 注释。

扩展自动实现的属性

如果必须将自动实现的属性转换为包含GetSet过程的扩展属性,Visual Basic Code 编辑器可以自动生成GetSet该属性的过程和End Property语句。 如果将光标置于 Property 语句后的空白行上,键入 G(对于 Get)或 S(对于 Set),然后按 ENTER,则会生成代码。 在 Property 语句末尾按 Enter 时,Visual Basic 代码编辑器会为只读和只写属性自动生成 GetSet 过程。

另请参阅