原则一:始终能的使用属性(property),而不是可直接访问的Data Member
Always use properties instead of accessible data members.
为什么要使用属性:
1.Net的data binding只支持Property,而不支持public data member的访问
Data binding的目的就是把一个object的Property绑定到一个用户界面的control上,web control或者windows form control. Data binding是通过reflection来实现的,
如下例: textBoxCity.DataBindings.Add("Text", address, "City");
这段code就是把textBoxCity的Text Property绑定到address这个object的City Property上。
如果你把address的City Property改成public data member,这段code是不会运行的。
2.当有新的需求时,通过修改Property的实现方法来适应这个新的需求,要比在你的程序里修改所有的public data member去适应这个需求容易太多了。
比如说你以前定义了一个类customer,现在你发现由于当初的粗心没有强制customer姓名不能为空,如果你使用了Property,你可以非常轻松的添加一个检查机制,
如下面这段code:
public class Customer
{
private string name;
public string Name
{
get
{
return name;
}
set
{
if ((value == null) || (value.Length == )) {
throw new ArgumentException("Name can not be blank", "Name");
}
name = value;
}
}
//...
}
如果你使用了public data member,你就要找遍你的程序,在每个地方都修改
3.Property是用methods实现的,所以添加multi-threaded的支持是非常方便的。
比如想要添加同步访问的支持:
public class Customer
{
private string name;
public string Name
{
get
{
lock (this)
{
return name;
}
}
set
{
lock (this)
{
name = value;
}
}
}
}
4..Property是用methods实现的,所以它拥有methods所拥有的一切。Property可以被定义为virtual:
你也可以把Property扩展为abstract,甚至成为interface的一部分。
总结:
总而言之,当你想让你类内部的数据被外界访问到时(不管是public还是protected),一定要用Property。
对于序列和字典,使用indexer。你类的data member永远应该是private,绝无例外。
使用Property,你可以得到如下好处:
1.Data binding支持
2.对于需求变化有更强的适应性,更方便的修改实现方法
记住,现在多花1分钟使用Property,会在你修改程序以适应设计变化时,为你节约n小时。