**属性结合了字段和方法的多个方面。 对于对象的用户,属性显示为字段,访问该属性需要相同的语法。 对于类的实现者,属性是一个或两个代码块,表示一个 get 访问器和/或一个 set 访问器。 当读取属性时,执行 get 访问器的代码块;当向属性分配一个新值时,执行 set 访问器的代码块。 不具有 set 访问器的属性被视为只读属性。 不具有 get 访问器的属性被视为只写属性。 同时具有这两个访问器的属性是读写属性。
与字段不同,属性不作为变量来分类。 因此,不能将属性作为 ref参数或 out参数传递。
属性具有多种用法:它们可在允许更改前验证数据;它们可透明地公开某个类上的数据,该类的数据实际上是从其他源(例如数据库)检索到的;当数据被更改时,它们可采取行动,例如引发事件或更改其他字段的值。
属性在类块中是按以下方式来声明的:指定字段的访问级别,接下来指定属性的类型和名称,然后跟上声明 get 访问器和/或 set 访问器的代码块。 例如:**
public class Date
{
private int month = 7; // Backing store
public int Month
{
get
{
return month;
}
set
{
if ((value > 0) && (value < 13))
{
month = value;
}
}
}
}
在此示例中,Month 是作为属性声明的,这样 set 访问器可确保 Month 值设置为 1 和 12 之间。 Month 属性使用私有字段来跟踪该实际值。 属性的数据的真实位置经常称为属性的“后备存储”。属性使用作为后备存储的私有字段是很常见的。 将字段标记为私有可确保该字段只能通过调用属性来更改。 有关公共和私有访问限制的更多信息,请参见访问修饰符。
get 访问器
get 访问器体与方法体相似。 它必须返回属性类型的值。 执行 get 访问器相当于读取字段的值。 例如,当正在从 get 访问器返回私有变量并且启用了优化时,对 get 访问器方法的调用由编译器进行内联,因此不存在方法调用的系统开销。 然而,由于在编译时编译器不知道在运行时实际调用哪个方法,因此无法内联虚拟 get 访问器。 以下是返回私有字段 name 的值的 get 访问器:
class Person
{
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
}
}
当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器以读取该属性的值。 例如:
Person person = new Person();
//...
System.Console.Write(person.Name); // the get accessor is invoked here
set 访问器
set 访问器类似于返回类型为 void 的方法。 它使用称为 value 的隐式参数,此参数的类型是属性的类型。 在下面的示例中,将 set 访问器添加到 Name 属性:
class Person
{
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
set
{
name = value;
}
}
}
当对属性赋值时,用提供新值的参数调用 set 访问器。 例如:
Person person = new Person();
person.Name = "Joe"; // the set accessor is invoked here
System.Console.Write(person.Name); // the get accessor is invoked here