一、字段的定义
字段是在类或结构中直接声明的任意类型的变量。
声明一个字段,可以用访问修饰符 类型 变量名称来声明,下图是一个简单的示例:


二、属性的定义
属性语法是字段的自然延伸,属性需要有get或者set的访问器。
声明一个属性,可以用访问修饰符 类型 变量名称来声明,下图是一个简单的示例:


?
三、字段的特性
1.字段通常不使用public关键字,仅在private和protected时才建议使用。如果您要使用public时,建议转为属性。这是为了符合面向对象设计的原因。简单一句话理解就是字段对内,属性对外。
2.可以对字段使用static关键字,这可使字段让调用方在任何时候进行调用,即使不存在任何类的实例。
3.也可以对字段使用static readonly关键字,这样很像const关键字。它们之间的区别是static readonly需要在运行时才可以访问,而const则编译的时候就已经可以访问了。
4.字段是在对象实例的构造函数被调用之前便初始化。 如果构造函数分配了该字段的新值,则它将覆盖在字段声明期间给定的任何值。
5.字段可以使用ref、out关键字传递。
四、属性的特性
1.属性需要定义访问器get或者set,或者两者都有。
2.属性可以隐式定义,即只有简单的get、set。这样声明会非常简洁。如:public int 成员数量 { get; set; }
3.属性还可以使用缓存式定义,这对于一些特殊情形下,非常有用,它通常会结合字段来进行缓存。如下图:


?
4.字段是变量,但属性不是变量噢。变量是可以使用ref、out关键字传递的,所以字段可以,但属性不可以。
6.属性可以抽象、虚化、密封,即属性可以加上abstract、virtual、sealed关键字。
五、其它的高级特性
1.老是使用get访问器,我是不是等于每次都调用一下方法,这样是不是增加了额外开销?
答:是等于调用方法,但不会增加额外开销。编译器已经自动优化了get访问器,不会产生额外开销。但是当该属性声明为virtual关键字,由于编译器搞不清楚会不会被子类重写属性,所以,这种情况下会产生额外开销。
2.编写属性时,我可以在get访问器更改缓存字段的值吗?


?
答:如上图,您可以更改缓存字段_number的值。但是这是一种非常差劲的编码风格。您不应该去更改_number字段的值,它的作用就让它仅仅用于记录缓存就好。
祝您用餐愉快。