自动实现的属性 (Visual Basic)

自动实现的属性使你可以快速指定类的属性,而不必编写代码以对属性进行 GetSet 操作。 为自动实现的属性编写代码时,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 代码编辑器可以为属性自动生成 GetSet 过程以及 End Property 语句。 如果将光标置于 Property 语句后的空白行上,键入 G(对于 Get)或 S(对于 Set),然后按 ENTER,则会生成代码。 在 Property 语句末尾按 Enter 时,Visual Basic 代码编辑器会为只读和只写属性自动生成 GetSet 过程。

另请参阅