数据成员与属性

来源:互联网 发布:夏日走过山间 知乎 编辑:程序博客网 时间:2024/06/01 18:21

class Stud
{
  public string name;
}

数据成员//data member\field
class stud
{
  public string name{get;set;}
}
属性//property

---------------------------------------

get       //取值

set       //赋值

value    //右值

----------------------------------------

<<Effictive C#>>第一条:

使用属性而不是数据成员。( Item 1: Use Properties Instead of Accessible Data Members)

ex1:

属性不仅仅只能被用在UI逻辑中。你在其它类和结构体(structure)中也应该使用属性。当你以后发现新的需求或行为时,属性将远远比数据成员更容易修改。你或许不久就会决定你的Customer类不能有空白的Name,如果你使用公有属性来定义Name,那么你只需要简单地做以下修改:

public class Customer
{
  private string name;
  public string Name
  {
    get

    {

       return Name;

    }
  set
   {
      if(string.IsNullOrEmpty(value))
      throw new ArgumentException(“Name can not be blank”,"Name”);
      Name = value;
   }
 }

}

如果你使用公有数据成员,你就必须非常小心地找出每个对Name进行赋值的代码,并对它们进行修改。那将会花费更多的时间——多得多呢!
--------------------------------------example 1 in  Item one of <<effictive C#>>  -------------------------------------------------------------------------------

属性可以拥有方法的所有语言特性。例如,属性可以为虚的(virtual)。

还可以将属性声明为抽象的(abstract),以类似隐式属性与法的形式将其定义在接口中。

///注:隐式类型局部变量

/* 转贴地址http://www.cnblogs.com/yuyijq/archive/2008/07/16/1244460.html

C# 3.0里多了一个关键字var,他表示这样的一种类型:C#编译器可以根据上下文推断的出来
比如var I = 5;编译器可以根据后面的赋值推断的出来i应该是个整型。既然是局部变量,那么它就只能用在方法内部了,注意C#是强类型的,引入了一个var并不是像javascript那样,变成了一个弱类型的语言。在编译器第一次编译后var就会被确定的类型所替代的。所以对于隐式类型局部变量要注意以下几点:

1.      它只能存在于方法内部
2.      它不是一个新的类型,只是一个关键字,或者叫做一个占位符,在C#编译器编译后它就会被确定的类型所替代
3.      它是编译器根据上下文推断出来的,所以所有一切不能被编译器推断出来的用法都是错误的。比如不能这样使用:var nullValue = null;因为null啥也不是,他是一个空指针,是一个不确定的东西。也不能这样使用:var I = 5;I = “abc”;编译器根据第一个赋值会推断出它是一个整型,但是随后又将一个字符串赋值给它,这是怎么回事呢?

*/

    在调用方面,属性虽然是方法,但他和数据却有着类似的概念。这会使你的调用者对属性有着一些潜意识的认识。例如,调用者会把属性访问当成是数据的访问。不管如何,而这看上去很像。属性访问器应该满足这些潜意识的预期。get访问器不应该有可被观察到的副作用。set访问器会修改状态,用户应该可以看到调用后带来的改变。

    无论何时需要在类型的公有或保护接口中暴露数据,都应该使用属性。你也应该使用索引器来暴露序列或字典。所有的数据成员都应该是私有的,没有任何例外。这样你就立即得到了数据绑定的支持,也便于日后对方法实现的各种修改。对于将任何变量封装到一个属性所需的额外输入工作其实不会占用太多时间,二日后若是需要使用属性来更正设计,则会花去大量的时间。现在多投入一点点,换来的是维护时的更加游刃有余。

 


原创粉丝点击