C# 字段与属性区别
来源:互联网 发布:java三大框架简述 编辑:程序博客网 时间:2024/06/16 19:50
转:http://blog.csdn.net/wensibo/article/details/7161017?ticket=ST-246656-bWKEJ2j3wCcROwEtcyoy-passport.csdn.net
首先从两者的声明上来看,公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装,它使用get和set访问器来控制如何设置或返回字段值。
由于属性的实质是方法(get或set方法),在IL中是没有属性的概念的。所以对于开发过程中常用的赋值和取值操作来说,使用公共变量肯定会比使用属性速度要快,性能上也稍高(方法和变量哪个速度不用说了吧)。
公共字段虽然在速度上快,但它必须开放字段为public,这样一来对象的调用者便可以直接修改其值,值的内容是否合法,运行中是否会出错,就没有了保障,进而会大大降低类的可重用性;相反,属性类似于方法,它可以对存入的变量的值进行处理,如果觉得该值不合法,可以就地变换或者直接提出警告。这对该类的对象的使用安全有很大好处,在运行过程中,因公共变量值的错误而产生的问题会大大减少。
如果满足下面几个条件,那么我们便可以大胆地使用公共字段:
1. 允许自由读写;
2. 取值范围只受数据类型约束而无其他任何特定限制;
3. 值的变动不需要引发类中其它任何成员的相应变化;
属性的使用条件则恰好跟变量相反,只要满足下面任何一个条件,就应该使用属性:
1. 要求字段只能读或者只能写;
2. 需要限制字段的取值范围;
3. 在改变一个字段的值的时候希望改变对象的其它一些状态;
总结:虽然在实际项目的开发过程中,公共字段和属性在合适的条件下都可以使用,但是我们应该尽可能的使用属性(property),而不是数据成员(field);把所有的字段都设置为私有字段,如果要暴露它们,则把它们封装成属性,这也是微软推荐的方式。
自动实现属性和常规属性的区别:
1:自动实现的属性必须同时声明 get 和 set 访问器。若要创建 readonly 自动实现属性,请给予它 private set 访问器。
2:自动实现的属性 (Property) 不允许具有属性 (Attribute)。如果您必须在属性 (Property) 的后备字段上使用属性 (Attribute),则应该只创建常规属性 (Property)。
3:从自动实现属性的定义来看,可以发现在get,和set中不能包含特殊的逻辑处理。这点从功能上讲有点类似字段的作用,但和字段又有区别。
什么是字段,这里不用多说,这里讲下字段和属性的区别:
1:字段在值的处理上并不是那么的灵活,给它赋什么它就是什么,不允许经过逻辑处理。如果把一个人的身高写成一个字段,给它赋值1000M,这显示是不正常的数据,字段无法处理这种特殊数据。
2:与字段不同,属性不作为变量来分类。因此,不能将属性作为 ref参数或 out参数传递。
常规属性分类:
1:按访问修饰符来分:可将属性标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户如何才能访问属性。
2:属性还可以标记成,静态属性,实例属性,虚属性,抽象属性,需要注意的是,如果属性已经标记成静态(static ) 的,那么后面不能和虚(virtual),抽象(abstract),重写(override)混用。
3:同一属性如果只包含get访问器,我们称之为只读属性,如果只包含set访问器,叫可写属性,如果即有get, 又有set访问器,我们叫可读可写属性。
什么是自动实现的属性?
当属性访问器中不需要其他逻辑时,自动实现的属性可使属性声明变得更加简洁。当您如下面的示例所示声明属性时,编译器将创建一个私有的匿名后备字段,该字段只能通过属性的 get 和 set 访问器进行访问。
- C# 字段与属性区别
- C# 字段与属性区别
- C#中字段与属性区别
- C#属性与字段
- C# 属性与字段
- C# 字段与属性
- C# 字段与属性
- 黑马程序员 C#基础_属性与字段的区别
- C#类中属性与字段(成员变量)区别
- C#中的字段与属性
- C#中的字段与属性
- C#中字段与属性
- C#中字段与属性
- 字段与属性的区别
- 属性与字段的区别
- 字段与属性的区别
- 属性与字段的区别
- 属性与字段的区别
- AOP面向切面编程
- mysql---备份数据
- 对str!=null &&str!="" 项目中的场景——对空值和空串的升级版,还有空白字符等等。
- spring boot 共享session redis实现
- 一元多项式的乘法运算(C语言)实现
- C# 字段与属性区别
- jackson 实体转json属性为NULL或者为空不参加序列化
- 125. Valid Palindrome
- 数据库的基本操作:索引、视图、导入和导出、备份和恢复
- easyUI datagrid(“load”,json 数据)
- vim快捷键
- C#基础-037 里氏转换
- markdown转pdf
- Using Different Versions of R