首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

准则1:使用 属性(Poperty)代替可直接访问的数据成员(Data Member)

2013-11-21 
原则1:使用 属性(Poperty)代替可直接访问的数据成员(Data Member)string name customerOne.Name custom

原则1:使用 属性(Poperty)代替可直接访问的数据成员(Data Member)
string name = customerOne.Name; customerOne.Name = "This Company, Inc.";

?

? ? ? ?这个简单有直观。你会觉得你以后使用属性替换数据成员 Name ,而且代码不做改动能照常工作。好吧,确实是那样的。属性就是访问起来跟数据成员一样。这个语法的目的就在于此。但是属性不是数据。属性访问和数据访问会产生不同的微软中间语言(Microsoft Intermediate Language)指令。

?

? ? ? ?尽管属性和数据成员在代码上兼容的。但在二进制上是不兼容的。一个很明显的案例,当你把一个 public 数据成员改为等同的 public 属性,意味着你要重新编译所有使用这个 public 数据成员的代码。 C# 把二进制程序集(assemblies)看做“第一类公民”。语言的一个目的就是你可以发布单一更新的程序集,而不要更新整个应用。把数据成员改为属性这么简单的行为却破坏二进制的兼容性。这个行为使得部署更新单一程序集变得更困难。

?

? ? ? ?如果你看了 IL 的属性实现,你可能很想知道属性和数据成员的相对性能。属性并不比数据成员快,但也不会慢多少。 JIT 编译器对属性的访问器做了 inline 的优化。如果 JIT 编译器做了 inline 属性访问器优化, 数据成员和属性的性能是一样的。即使没有属性访问器没有置为 inline ,性能差别也只是可以忽略不计的一个函数调用话费。这差别只有在少数情况下才可以被测量出来。

?

? ? ? ?属性是像数据一样被调用的方法。调用者就会有一些访问权限期望。他们把访问属性当做数据访问。毕竟,那就是属性。你的属性访问器要能满足这些期望。 Get 访问器不能有其他作用。 Set 访问器改变了状态,调用者要能看到改变。

?

? ? ? ?属性访问器同时满足使用者的性能期望。属性访问跟数据域访问很类似。这不能导致属性和简单数据访问有着显著不同的性能特点。属性访问不能在长计算,或跨平台调用(比如执行数据库查询),或其他长操作和使用者期望保持一致。

?

? ? ? ?无论什么时候,你要在类中暴露数据作为 public或 protected 接口,请使用属性。对于序列或 dictionaries 是使用索引器。所有数据成员应该无一例外地使用 ?private 修饰符。你会立即在数据绑定得到支持,而且在以后会很容易方法中的实现。把变量封装在属性里所有的打字功夫加起来就一到两分钟。你会发现在使用属性替换之前的设计会花费数小时。现在花一点时间,以后节约你大量时间。

?

?

?

?

?

小结:

? ? ? ?万事开头难,终于写下了翻译 Effective C# : 50 Specific Ways to Improve Your C# ?2nd Edition 的第一篇,花的时间有点心疼,感觉颈椎都熬出问题了(太专注了)。之前工作都没觉得什么,看来还是工作不要那么专注,以后把时间挤出来干这个,加油!发现最后一句话说的蛮好的:Spend a little time now, and save yourself lots of time later. 分享给大家.....

? ? ? ? 因为是第一次翻译,欢迎各种不爽,各种喷,写这个纯属个人爱好,秉持”分享“之德!

?

? ? ? ? 如果您对D.S.Qiu有任何建议或意见可以在文章后面评论,或者发邮件(gd.s.qiu@gmail.com)交流,您的鼓励和支持是我前进的动力,希望能有更多更好的分享。

? ? ? ? 转载请在文首注明出处:http://dsqiu.iteye.com/blog/1976256

更多精彩请关注D.S.Qiu的博客和微博(ID:静水逐风)

?

?

热点排行