.NET C# Web开发学习之路(14)—— 字段和属性
字段
字段是一种数据成员,其中容纳了一个值类型或者一个引用类型的引用。一般在类的内部做数据交互使用。字段就好比我们的个人所有财产,仅供个人使用,所以一般是private修饰。
属性
属性是一种用于访问对象或类的特性的成员。属性具有访问器,这些访问器指定它们在的值被读写时需要执行的语句,因此属性提供了一种机制,即把读取和写入对象的某些特性与一些操作关联起来。可以像使用公共数据成员一样使用属性。
属性结合了字段和方法的多个方面。对于对象的用户,显示为字段,访问该属性仍需要完全相同的语法;对于类的实现者,属性是一个或两个代码块,表示一个get访问器和一个set访问器。读取时,执行get访问器的代码块;写入时,执行set访问器的代码块。
注意:属性不能作为ref或out传递参数
属性一般用来在面向对象设计中描述对象的静态特征。属性其实就是外界访问私有字段的入口,属性本身不保存任何数据,在对属性赋值和读取的时候其实就是操作对应的私有字段。属性本质是一个方法,通过get和set来操作对应的字段。
属性的作用
避免出现非法数据,例如一个年龄属性,正常逻辑年龄是不可以出现负数的,如果用户对哦年龄进行了负数的赋值,我们沟通过set方法加入判断逻辑,从而排除这种非法数据。
private int age; public int Age { get { return age;} set { if(value < 0) { age = 18; } else { age = value; } } }
限定属性只读或者只写。例如有些属性为了保护数据,我们只能读取,不能赋值。具体使用根据需要屏蔽get或者set方法大道只读或者只写。
private const double pi=3.14; public double Pi { get{return pi;} } // Student s = new Student(); s.pi = 111;//运行程序,编译报错,无法对属性或索引器pi赋值,它是只读的
字段与属性的联系
有时候我们会比较矛盾,既然已经有了字段,为什么还要用属性呢?
如果在一个类中,有一个共有字段,那么在这个类的外部可一随便访问和使用这个字段,想怎么来就怎么来,一旦这个字段被赋了一个非常离谱的值,那么对程序可能会造成很大的影响。以前我在写代码的时候,没有注意到这一点,在类中只使用字段,而且还是public修饰的,没有使用属性来保护那些本来应该是类的私有的字段。
总结:
- 属性对外:暴露数据,数据是可以存储在字段里的,也可以是动态计算出来的
- 对内:保护字段不受“非法值”污染
- 一般情况下,他们都用于表示实体(对象或者类型)的状态。
- 属性大多数情况下是字段的包装器
建议:永远使用属性,而不是字段来暴露数据,即字段永远是private或者protected的
自动属性
编写属性的新语法(.NET 3.0 及以后版本)
private int age;
public int Age
{
get{return age;}
set{age = value;}
}
可以直接写成:
public int Age{get;set;}
注意:没有特定业务逻辑的属性都可以简写成自动属性,自动属性的格式不能更改。自动属性对应的字段由编译器自动生成。