对C#开发两个基本原则的深入讨论

使用属性,避免将数据成员直接暴露给外界

学习研究.NET的早期,经常碰到一些学习C#/.NET的朋友问,要属性这种华而不实的东西做什么?后来做项目时也时常接到team里的人的抱怨反馈,为什么不直接放一个public字段?如:

class Card
{
 public string Name;
}

而非要做一个private字段+public属性?

class Card
{
 private string name;
 public string Name
 {
  get { return this.name;}
  set { this.name=value;}
 }
}

我记得在早期的一个项目里,team中的一个朋友甚至厌烦了写private字段+public属性,尤其是碰到一大堆臃肿的data object class的时候,索性自己写了一个小工具,来提供一个类的字段名和类型,然后自动为该类生成相应的private字段+public属性。

我在编程的时候是个彻底的实用主义者,用稍微高雅一点的话说叫“不喜欢过度的设计”。如果真的像上面那样写Card,而且在将来没有什么改变的需求,我也不喜欢像上面第2段程序那样把事情故意搞得复杂。但如果从component的角度来讲,总有一些class是要供外部长久地使用,也潜在地在将来有被改变的需求。这时候,提供属性就很有必要了。

这就是这个Item试图要归纳的使用属性的理由:

1.可以对赋值做校验、或者额外的处理

2.可以做线程同步

3.可以使用虚属性、或者抽象属性

4.可以将属性置于interface中

5.可以提供get-only或者set-only版本,甚至可以给读、写以不同的访问权限(C# 2.0支持)

个人感觉3、4条是属性最大的优点,可以填补没有“虚字段”或“抽象字段”的缺憾,在设计组件的时候非常有用,也体现了C#这样的component-oriented语言的精神内涵。

但如果没有上述理由,而且日后对程序做大的改动可能性比较小时,我想也大可不必非要把每个public字段都要变成属性。比如在设计一些轻型的struct,用于互操作的时候,直接使用public字段没什么不好。所以,感觉本条目Bill Wagner先生使用“Always Use Properties Instead of Accessible Data Members”显得太过强硬。

其实,这里的讨论也表明阅读《Effective C#》一书时需要注意的地方,即Effective原则并不是放之四海而皆准的。不同的项目(组件化、复用程度较高的项目?还是“一次编写、N年都run”的项目),不同的角色(类库/组件开发人员?还是应用程序开发人员?),有着不同的Effective准则。事实上,书中很多Items都是从类库/组件开发人员的角度来考虑的。

关于属性的性能问题需要谈一点,如果仅仅是简单地以存取模式来使用属性,在相当程度上是没有性能损失的。因为在JIT编译过程中已经做了inline的处理。不过inline处理还是有一些基本的条件,有些情况下JIT编译器不会inline,比如虚调用,方法的IL代码长度过长(目前CLR的规定是超过32bytes为代码长度过长),有复杂的控制流逻辑,有异常处理等。这些条件都是要么根本不能使用inline(比如虚属性),要么inline的代价太大,容易导致代码的bloat,要么是inline起来很费时间——已经丧失了inline的意义,因为.NET的inline机制发生在JIT过程中。使用属性有个别让人感觉不舒服的地方,比如它影响开发人员的开发效率,但对代码运行的效率不产生影响。

时间: 2024-09-12 02:39:29

对C#开发两个基本原则的深入讨论的相关文章

对C#开发的两个基本原则的深入讨论

使用属性,避免将数据成员直接暴露给外界 学习研究.NET的早期,经常碰到一些学习C#/.NET的朋友问,要属性这种华而不实的东西做什么?后来做项目时也时常接到team里的人的抱怨反馈,为什么不直接放一个public字段?如:class Card{ public string Name;} 而要做一个private字段+public属性 class Card{ private string name; public string Name { get { return this.name;} se

java web开发两年工作经验,在天津待遇是多少?

问题描述 java web开发两年工作经验,在天津待遇是多少? 解决方案 6000左右,看个人情况解决方案二:天津离北京这么近,不来北京可惜了...解决方案三:8K左右吧解决方案四:三年9K!解决方案五:深圳一年经验6k解决方案六:平心而论,两年6K,现在的大环境是比较困难的.

用pb12开发两个程序,这两个程序中要传递一些数据

问题描述 用pb12开发两个程序,这两个程序中要传递一些数据 用pb12开发两个程序,这两个程序中要传递一些数据,该怎么去实现简单一点,具体用哪些方法去实现.这两个程序是放在局域网中的.需要导入哪些插件或.pbl等吗? 解决方案 共享数据库.文件(windows共享文件)

计算思维:计算的两个基本原则

问题描述 计算思维:计算的两个基本原则 做题做到计算思维:计算的两个基本原则是什么?求大神们指导 找资料也找不到 解决方案 这种问题没有什么答案,属于"阅读理解",你的教材怎么说,你就怎么答.本身这个题目就是胡编出来的.谁承认计算有2个基本原则而不是3个或者1个. 解决方案二: 发挥空间比较大 但是说到基本 那不就是满足计算的目的么. 你看 算法的基本原则是什么啊 简练下 就是 算法正确 ,有解 解决方案三: 采用二进制数制 按照程序顺序执行

娱乐开发两不误,10大开源游戏框架推荐

游戏技术的不断发展和游戏模式的不断创新,给技术专家带来了许多新的挑战. 从角色扮演游戏到即时策略游戏,从冒险解谜游戏到动作射击游戏,甚至是只有一兆大小的迷你游戏,都有起着核心作用的技术组成部分. 本文将介绍十大好用的开源游戏引擎和框架,希望能给你的游戏开发带来帮助. 01 网易游戏服务器框架 Pomelo https://www.oschina.net/p/pomelo Pomelo 是由网易开发的基于 Node.js 开发的高性能.分布式游戏服务器框架, 也可作为高实时 Web 应用框架. P

web开发-两个不同WEB系统之间限定条件的信息交互问题

问题描述 两个不同WEB系统之间限定条件的信息交互问题 设存在两个web项目,分别是ProjectA和ProjectB,ProjectB不可修改,ProjectA可任意修改. ProjectA存在a1页面,ProjectB存在b1页面. b1页面实现的是账号.密码登陆功能. a1页面存在一个按钮btn1,点击btn1则打开新的标签页且链接到b1页面,同时在a1页面中弹出提示"未登陆". 在新的标签页链接到的b1页面上登陆成功后,a1页面提示从"未登陆"转换为&quo

育碧1666开发被叫停 两部新品正在研发

育碧今天在投资者会议中宣布,<1666>的开发已经被叫停.这一项目是一月份收购THQ部分财产的时候获得的.根据育碧的http://www.aliyun.com/zixun/aggregation/32086.html">首席执行官Yves Guillemot称,育碧无法"与Patrice Désilets的开发进度和团队管理步伐协调." Guillemot说,公司花费了两个月的时间来与Désilets讨论这一项目,最终双方的合作结束,<1666>

暴雪加快《魔兽》第四部资料片的开发预计两年内推出

暴雪公司网游<魔兽世界>(World of Warcraft)的总设计师汤姆·切尔顿(Tom Chilton)接受了一次采访,在采访中他透露,<魔兽世界>的下一部资料片的开发速度将会更快于以往三部资料片.不过,目前还没有具体的此项目计划放出,他说暴雪期望最新资料片版本尽量在两年内完成. 他的制作小组花了几年的时间完成了资料片大灾变的开发,拥有高质量内容的大灾变版本也是暴雪的最新游戏开发技术的结晶. 现在,整个游戏世界的面貌都改变了,他们希望尽力在一年左右的时间完成新资料片的开发,并

如何开发绚丽、高效率的界面(Windows嵌入式系统)

上篇文章中提到用户体验(UE),并且说到国内有专门去做UE的团队也很少.据我了解Microsoft.Nokia.Google等,还有国内的Baidu是有比较专业的UE团队.对于我们这样的普通团队.普通开发者来说,这样的经验实在太少了.而且普遍更认为UE是UI Designer的事情,与我们这样的Developer没有太多关系. 当然不是,UE远超过UI.很多因素造成了UE差,比如一份不正确的数据表明17%的用户认为手机运行速度慢,Windows Mobile手机开机漫长的等待就十分的让我受不了.