Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。
Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
我们的目标:尽可能编写出运行效率更高,更健壮,更容易维护的C#代码。
原则一:尽可能的使用属性(property),而不是数据成员(field)。
Always use properties instead of accessible data members.
出于以下几点原因,请在设计类时,尽可能的使用属性,而不是成员。
1、.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不被支持的内容。看看.net里的属性面板,你会明白的。
2、数据安全性检测;
属性本质上是两个函数,只是因为C#的特殊语法,但我们可以像访问成员一样的访问它。因此我们可以在属性设计上添加更多更灵活的内容,对属性进行管理。其中对属性数据的检测是其中之一。
在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决,千万不要设置默认值,这是很危险的事情。例如:
public string Name{
get{
if(this._Name==null){
return “NoName”;
}else{
return this._Name;
}
}
set{
if(value==null){
this._Name = “NoName”;
}else if(value.Length<=10){
this._Name = value;
}else{
this._Name = value.SubString(0,10);
}
}
}
看上去很不错不是吗?请马上动手修改你的代码吧,上面的代码是很危险的!或者你还不明白,明明对数据进行了安全检测,为什么还是危险的呢?试想这样的情况,有两个实例o1与o2, o1的Name为null,我们做了这样的事:o2.Name = o1.Name;
结果是什么?o2.Name为”NoName”,而在本质上,o1与o2的Name是根本不相等的。这会对后面的程序运行带来很大的麻烦。请以抛出异常的形式来解决数据不满足条件时的问题。
3、线程同步
对实例的属性可以进行线程同步,而与访问者无关。例如:
public string Name{
set{
lock(this){
//…
}
}
}
当然,你完全可以在类的外面进行线程同步,但那样的工作量远比上面的方法大得多。推荐你使用上面的方法进行线程同步,如果要对静态成员同步,请用lock(typeof(MyClass))方法。
4、属性可以是抽象的,而数据成员不能是抽象的,这为我们设计出兼容性更强,扩展性更强的类提供了好的解决方案。
5、属性可以以接口的形式表现。接口里不能定义数据成员,这在一定程度上限制我们的设计。请用属性来解决这个问题吧。
6、基于属性的索引。索引器是C#语法的特殊内容,而索引器正是通过属性来完成的,如果你想为你的类添加一个索引器,除了用属性你还能用什么呢?
7、最后一点,也是比较重要的。不要直接把公共成员转化成属性。
看了上面的说明,是不是觉得应该马上把所有的数据成员都修改成属性了呢?在你修改前一定要阅读下面的内容。
不要直接把公共成员转化成属性。它们在C#的源代码级上的语法虽然是相同的,但在IL上是不同的。即:o1.Name(属性)和o1.Name(成员),虽然C#代码一样,但IL的代码是不一样的。所以,当你准备修改所有的数据成员时,必须重新编译类的代码,同时也要重新编译访问该类实例的所有相关代码。所以,在你设计时不要为了方便,想先用数据成员使用,然后在后期再修改成属性,这不是一个好主意。
最后,不要为因为使用属性而使IL代码多了几行而担心。虽然数据成员在访问上比属性要快一点,但在实际运行时,不仅对人觉得是一样的,对机器而言感觉也像是一样的快,因为我的CPU越来越快了,完成一个函数调用太快了,跟完成一个数据访问一样的快(当然,这个函数得足够小,就跟我们的属性一样),呵呵。
OK,关于使用属性的问题就先说这些。
Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。相关推荐
- Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
我们的目标:尽可能编写出运行效率更高,更健壮,更容易维护的C#代码. 原则一:尽可能的使用属性(property),而不是数据成员(field). Always use properties inst ...
- [转]Effective C#原则4:用条件属性而不是#if
使用#if/#endif 块可以在同样源码上生成不同的编译(结果),大多数debug和release两个版本.但它们决不是我们喜欢用的工具.由于#if/#endif很容易被滥用,使得编写的代码难于理解 ...
- 荐读|属性与可直接访问的数据成员之间应该如何选
写在前面 在书写C#代码的时候你是否有过这样的经历:经常混用属性以及公有的数据成员.毕竟他们的用法基本一致,对于使用来说好像没什么区别啊.其实我也经常使用类的公有的数据成员来定义一些常量,为了简单,在 ...
- 1.1 - C#语言习惯 - 使用属性而不是可访问的数据成员
属性一直是C#语言中的一等公民.自1.0版本以来,C#对属性进行了一系列的增强,让其表达能力不管提高.你甚至可以为setter和getter指定不同的访问权限. 隐式属性也极大降低了声明属性时的工作量 ...
- Effective C# 原则16:垃圾最小化(译)
Effective C# 原则16:垃圾最小化 Item 16: Minimize Garbage 垃圾回收器对内存管理表现的非常出色,并且它以非常高效的方法移除不再使用的对象.但不管你怎样看它,申请 ...
- Effective C# 原则11:选择foreach循环
Effective C# 原则11:选择foreach循环 Item 11: Prefer foreach Loops C#的foreach语句是从do,while,或者for循环语句变化而来的,它相 ...
- Effective C# 原则38:使用和支持数据绑定(译)
Effective C# 原则38:使用和支持数据绑定 Item 38: Utilize and Support Data Binding 有经验的Windows程序员一定对写代码从一个控件上取值,以 ...
- Effective C# 原则13:用静态构造函数初始化类的静态成员(译)
Effective C# 原则13:用静态构造函数初始化类的静态成员 Item 13: Initialize Static Class Members with Static Constructors ...
- Effective C# 原则34:创建大容量的Web API(译)
Effective C# 原则34:创建大容量的Web API Item 34: Create Large-Grain Web APIs 交互协议的开销与麻烦就是对数据媒体的如何使用.在交互过程中可能 ...
最新文章
- 三步更改win7开机密码
- 洲际的merlin怎么用_天问一号是怎么拍摄地月合影的?
- SAP物料主数据采购视图采购价值代码设置
- layer 线上_LAYER
- android界面设计字体大小,Andoird用户界面设计上手指南:设置字体大小
- python __slots__ [转]
- 充分释放数据价值:安全、可信6到飞起
- MVC源码分析 - 路由匹配
- 蓝桥杯 ADV-74 算法提高 计算整数因子
- loadrunner提高篇 - 关联技术的经典使用
- 慢慢欣赏linux 串口驱动架构
- 微信小程序中输出大于号和小于号
- 物联网案例(二):物联网系统如何进行实时决策
- JCMsuite应用:光子晶体谐振腔光子晶体谐振腔
- NEC红外线解码协议
- 小学英语与计算机技术整合,小学英语课程与信息技术的整合
- 易經大意(7) 三和 韓長庚 著
- php写商城,小白学习使用Thinkphp5写一个商城项目
- 目标检测算法回顾之传统算法
- LoRa模块网络组成和架构原理是怎样的?