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)。相关推荐

  1. Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)

    我们的目标:尽可能编写出运行效率更高,更健壮,更容易维护的C#代码. 原则一:尽可能的使用属性(property),而不是数据成员(field). Always use properties inst ...

  2. [转]Effective C#原则4:用条件属性而不是#if

    使用#if/#endif 块可以在同样源码上生成不同的编译(结果),大多数debug和release两个版本.但它们决不是我们喜欢用的工具.由于#if/#endif很容易被滥用,使得编写的代码难于理解 ...

  3. 荐读|属性与可直接访问的数据成员之间应该如何选

    写在前面 在书写C#代码的时候你是否有过这样的经历:经常混用属性以及公有的数据成员.毕竟他们的用法基本一致,对于使用来说好像没什么区别啊.其实我也经常使用类的公有的数据成员来定义一些常量,为了简单,在 ...

  4. 1.1 - C#语言习惯 - 使用属性而不是可访问的数据成员

    属性一直是C#语言中的一等公民.自1.0版本以来,C#对属性进行了一系列的增强,让其表达能力不管提高.你甚至可以为setter和getter指定不同的访问权限. 隐式属性也极大降低了声明属性时的工作量 ...

  5. Effective C# 原则16:垃圾最小化(译)

    Effective C# 原则16:垃圾最小化 Item 16: Minimize Garbage 垃圾回收器对内存管理表现的非常出色,并且它以非常高效的方法移除不再使用的对象.但不管你怎样看它,申请 ...

  6. Effective C# 原则11:选择foreach循环

    Effective C# 原则11:选择foreach循环 Item 11: Prefer foreach Loops C#的foreach语句是从do,while,或者for循环语句变化而来的,它相 ...

  7. Effective C# 原则38:使用和支持数据绑定(译)

    Effective C# 原则38:使用和支持数据绑定 Item 38: Utilize and Support Data Binding 有经验的Windows程序员一定对写代码从一个控件上取值,以 ...

  8. Effective C# 原则13:用静态构造函数初始化类的静态成员(译)

    Effective C# 原则13:用静态构造函数初始化类的静态成员 Item 13: Initialize Static Class Members with Static Constructors ...

  9. Effective C# 原则34:创建大容量的Web API(译)

    Effective C# 原则34:创建大容量的Web API Item 34: Create Large-Grain Web APIs 交互协议的开销与麻烦就是对数据媒体的如何使用.在交互过程中可能 ...

最新文章

  1. 三步更改win7开机密码
  2. 洲际的merlin怎么用_天问一号是怎么拍摄地月合影的?
  3. SAP物料主数据采购视图采购价值代码设置
  4. layer 线上_LAYER
  5. android界面设计字体大小,Andoird用户界面设计上手指南:设置字体大小
  6. python __slots__ [转]
  7. 充分释放数据价值:安全、可信6到飞起
  8. MVC源码分析 - 路由匹配
  9. 蓝桥杯 ADV-74 算法提高 计算整数因子
  10. loadrunner提高篇 - 关联技术的经典使用
  11. 慢慢欣赏linux 串口驱动架构
  12. 微信小程序中输出大于号和小于号
  13. 物联网案例(二):物联网系统如何进行实时决策
  14. JCMsuite应用:光子晶体谐振腔光子晶体谐振腔
  15. NEC红外线解码协议
  16. 小学英语与计算机技术整合,小学英语课程与信息技术的整合
  17. 易經大意(7) 三和 韓長庚 著
  18. php写商城,小白学习使用Thinkphp5写一个商城项目
  19. 目标检测算法回顾之传统算法
  20. LoRa模块网络组成和架构原理是怎样的?

热门文章

  1. 直播报名 | 教你从 0 到 1 打造数字化运营闭环
  2. 百田公司:与神策数据携手,筑就爆款游戏背后的 4 个数据砝码
  3. 程序员如何让自己的工作更上一个台阶
  4. sysbench 压测 详解
  5. 全文检索引擎Solr系列——Solr核心概念、配置文件
  6. Linux系统的中断、系统调用和调度概述【转】
  7. 编程之美——买书问题:贪心算法
  8. PowerDesigner 正向工程 和 逆向工程 说明
  9. 【转】#ifndef作用
  10. 升级造成eclipse插件失效