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:   

      

 1 public class Customer
 2     {
 3         private string name;
 4         public string Name
 5         {
 6             get
 7             {
 8                 return name;
 9             }
10             set
11             {
12                 if ((value == null) || (value.Length == 0)) {
13                     throw new ArgumentException("Name can not be blank", "Name");
14                 }
15                 name = value;
16             }
17         }
18         //...
19     }
View Code

       如果你使用了public data member,你就要找遍你的程序,在每个地方都修改

   3.Property是用methods实现的,所以添加multi-threaded的支持是非常方便的。

       比如想要添加同步访问的支持:

 1 public class Customer
 2     {
 3         private string name;
 4         public string Name 
 5         { 
 6             get 
 7             { 
 8                 lock (this) 
 9                 { 
10                     return name; 
11                 } 
12             } 
13             set 
14             { 
15                 lock (this) 
16                 {
17                     name = value; 
18                 }
19             } 
20         }
21     }
View Code

   4..Property是用methods实现的,所以它拥有methods所拥有的一切。Property可以被定义为virtual:

       你也可以把Property扩展为abstract,甚至成为interface的一部分。

  总结:

      总而言之,当你想让你类内部的数据被外界访问到时(不管是public还是protected),一定要用Property。

      对于序列和字典,使用indexer。你类的data member永远应该是private,绝无例外。

      使用Property,你可以得到如下好处:

      1.Data binding支持

      2.对于需求变化有更强的适应性,更方便的修改实现方法

记住,现在多花1分钟使用Property,会在你修改程序以适应设计变化时,为你节约n小时。

原文地址:https://www.cnblogs.com/kest/p/4381215.html