Effective C# 学习笔记(原则一:始终能的使用属性(property),而不是可直接访问的Data Member)

时间:2023-03-08 17:27:22
Effective C# 学习笔记(原则一:始终能的使用属性(property),而不是可直接访问的Data Member)

原则一:始终能的使用属性(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小时。