属性用于封装一些数据。您可以使用普通字段:
public string MyField
但是这个字段可以被类的所有外部用户访问。人们可以插入非法值或以你没有预料到的方式更改该值。
通过使用属性,您可以封装数据访问的方式。 C#有一个很好的语法,可以将字段转换为属性:
string MyProperty { get; set; }
这被称为自动实现属性。在需要的时候,可以将属性扩展为:
string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
现在您可以添加验证 setter
中的值的代码:
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException();
_myProperty = value;
}
属性还可以为getter和setter使用不同的访问器:
public string MyProperty { get; private set; }
通过这种方式,您可以创建一个属性,任何人都可以读取该属性,但只能由类本身进行修改。
您还可以为您的getter
添加完全自定义的实现:
public string MyProperty
{
get
{
return DateTime.Now.Second.ToString();
}
}
C#编译自动属性时,会生成中间语言(IL)。在IL中,你会看到一个get_MyProperty
和一个set_MyProperty
方法。它还会创建一个名为<MyProperty>k_BackingField
的后备字段(通常这在C#中是非法命名,但在IL中却是合法的,这样可以避免生成的类型与你自己代码之间的冲突)。然而,在C#中,你应该使用官方属性语法。这样可以使C#使用起来更加愉悦(例如,在 IntelliSense 中)。
按照惯例,不应该使用属性进行耗时较长的操作。