属性概述
组件应该定义属性而不是公共字段,因为可视化设计器(如 Visual Studio)在属性浏览器中显示属性,而不显示字段。 (在本主题的最后列出了定义属性的其他强制性的原因)。
属性就像智能字段。 属性通常具有带访问函数的专用数据成员,在语法上属性被作为类的字段进行访问。 (虽然属性可以具有不同的访问级别,但此处的讨论将重点放在公共访问这种更加常见的情况上。)因为 Visual Basic 的许多版本中都可以使用属性,Visual Basic 程序员可以跳过本主题。
属性定义通常由以下两部分组成:
专用数据成员的定义。
private int number = 0;
Private number As Integer = 0
使用属性声明语法对公共属性进行的定义。 该语法通过 get 和 set 访问函数将专用数据成员和公共属性关联起来。
public int MyNumber { // Retrieves the number data member. get { return number; } // Assigns to the number data member. set { number = value; } }
Public Property MyNumber As Integer ' Retrieves number. Get Return number End Get ' Assigns to number. Set number = value End Set End Property
value 这个术语是属性定义语法中的一个关键字。 在调用代码中,将变量 value 分配给属性。 value 的类型必须同它被分配到的属性的声明类型相同。
虽然属性定义中通常包含专用数据成员,但这不是必需的。 get 访问器不用访问私有数据成员就可以返回值。 get 方法返回系统时间的属性就属于这种情况。 属性启用数据隐藏,访问器方法隐藏属性的实现。
在不同的编程语言中,属性语法存在一些差异。 例如,术语“property”(属性)不是 C# 中的关键字,但却是 Visual Basic 中的关键字。 有关语言特定的信息,请参见有关该语言的文档。
下面的示例在类 SimpleProperty 中定义了一个名为 MyNumber 的属性,并从类 UsesSimpleProperty 访问 MyNumber。
public class SimpleProperty
{
private int number = 0;
public int MyNumber
{
// Retrieves the data member number.
get
{
return number;
}
// Assigns to the data member number.
set
{
number = value;
}
}
// Other members.
}
public class UsesSimpleProperty
{
public static void Main()
{
SimpleProperty example = new SimpleProperty();
// Sets the property.
example.MyNumber = 5;
// Gets the property.
int anumber = example.MyNumber;
}
}
Public Class SimpleProperty
Private number As Integer = 0
Public Property MyNumber As Integer
' Retrieves number.
Get
Return number
End Get
' Assigns to number.
Set
number = value
End Set
End Property
' Other members...
End Class
Public Class UsesSimpleProperty
Public Shared Sub Main()
Dim example As New SimpleProperty()
' Sets the property.
example.MyNumber = 5
' Gets the property.
Dim anumber As Integer = example.MyNumber
End Sub
End Class
一般说来,get 和 set 方法和其他方法没有什么不同。 它们可以执行任何程序逻辑、引发异常、被重写以及用编程语言允许的任意修饰符进行声明。 但是请注意,属性也可以是静态的。 如果属性是静态的,则在 get 和 set 方法可以实现的功能上有一些限制。 有关详细信息,请参见编程语言参考。
属性的类型可以是基元类型、基元类型的集合、用户定义类型或用户定义类型的集合。 对于所有基元类型,.NET Framework 提供实现字符串到值转换的类型转换器。 有关详细信息,请参见通用类型转换。 当属性可以使用类型转换器时,它显示在设计器的属性浏览器中。 如果您定义自定义属性并想让属性浏览器显示它们,则必须实现自定义类型转换器。
当属性的数据类型是枚举时,开发环境(例如 Microsoft Visual Studio)在“属性”窗口中将该属性显示为下拉列表。 如果属性的数据类型是具有属性的类,这些属性叫做定义属性的子属性。 在 Visual Studio 的“属性”窗口中,用户可以展开属性以显示其子属性。
向属性添加特性十分重要,这样它们可以在设计时正确地显示在属性浏览器中。 有关详细信息,请参见组件的设计时特性。
您应该公开组件的属性而不是公共字段,因为属性的版本可以控制,它们允许数据隐藏,并且访问器方法可以执行附加逻辑。 通常,由于有实时优化,属性的开销并不比字段大。