《Effective C#》读书笔记(1)

        Bill Wagner先生的《Effective C#》一书保持作者一贯的风格,很值得我们一读。很早就想把读此书的感想写出来,一直没有时间,最近总算比较轻闲,借此写出读此书的心得,水平有限,希望对大家有所帮助

        Item 1: Always Use Properties Instead of Accessible Data Members
        第一项:永远使用属性而不要直接访问数据成员

        说到属性,大家肯定都知道。
        比如:        
        class Person
        { 
              
private string name; 
              
public string Name 
               { 
                  
get { return this.name;} 
                  
set { this.name=value;} 
               } 
        }

        具体属性能给我们带来什么好处呢?为什么必须使用属性来访问而不直接使用public来访问呢?这些肯定是大家最想知道的。 
        
        在本Item中,介绍了使用属性可以为我们带来以下的好处。 
        1、对赋值进行校验或者其他的处理。
        2、遵守封装原则。
        3、便于做线程同步访问。
        4、支持虚属性、抽象属性,并且可以在接口中使用。
        5、在C#2.0中,属性的get,set方法将支持不同的访问权限。

        那我们为什么要使代码复杂话来使用属性,而不直接使用public来访问,这样不是简单的多吗?不少人都有这样的疑惑。让我们来
看看通过属性访问和public来访问有什么区别。
        
        首先来看看使用public访问,当我们建立类的实例后,这时将会为public的字段分配动态内存。
        
        而通过属性访问,在定义1个属性的时候,编译器会在生成的托管模块中产生以下3项:
        ·1个表示属性的get访问器的方法,只有定义了get访问器方法才会创建
        ·1个表示属性的set访问器的方法,只有定义了set访问器方法才会创建
        ·1个位于托管模块元数据中的属性定义。

        在我们使用属性的时候,Get and Set都被标注为hidebysig, specialname。也就是说它们不能被C#源代码直接调用,它们也不是正是的类
型定义。你只能通过
Property来访问它们。JIT编译器会将属性访问的代码进行内联(inline)处理,这样使用属性时就不会再有运行时的性
能损失(相对与字段访问来讲)。但要注意的是,只有对那些执行时间比较短的操作我们才应该使用属性,而对于执行时间长的就应该使
用方法。

        PS:内联是指将1个方法内的代码直接编译到调用它们的方法中,从而消除调用方法时的运行负担,但它的代价时编译后的方法代码
变得比较庞大。由于属性的访问器方法通常含有比较少的代码,所以内联它们会使代码变得更小,执行效率更高!
       

posted @ 2005-08-07 00:15 jierry 阅读(1084) 评论(10) 编辑 收藏

 回复 引用 查看   
#1楼2005-08-07 01:12 | 怀沙      
支持,加油
 回复 引用 查看   
#2楼[楼主]2005-08-07 16:22 | jierry      
我会坚持写完的^_^
 回复 引用   
#3楼2005-09-26 20:38 | fid[未注册用户]
你和抄书有什么区别,写点书评也比写什么读书笔记有价值!
 回复 引用 查看   
#4楼[楼主]2005-10-08 17:28 | jierry      
你觉得没价值可以不看拉,没有强迫你看啊^_^
 回复 引用   
#5楼2005-11-08 10:44 | reiko[未注册用户]
好文章,值得学习!
 回复 引用   
#6楼2005-11-24 21:37 | wanglai[未注册用户]
请问有这本书的电子版吗?找了很多地方都没找到,如果有的话能发给我一本吗?多谢了.wanglai@126.com
 回复 引用 查看   
#7楼2005-12-30 17:55 | 叶晖俊      
再接着写呀
 回复 引用 查看   
#8楼2006-04-20 21:49 | overred      
3Q
very good

 回复 引用 查看   
#9楼2006-09-05 15:24 | 西北望      
1、对赋值进行校验或者其他的处理。
2、遵守封装原则。
3、便于做线程同步访问。
4、支持虚属性、抽象属性,并且可以在接口中使用。
5、在C#2.0中,属性的get,set方法将支持不同的访问权限。

对于这几点能不能写例子来证明呢?" 3、便于做线程同步访问。"能不能写个用属性和数据成员的对比例子呢?
那样lz的文章关注度会更有深度吧,lz应该多点自己的见解,毕竟看老外的东西一不留神就落过了许多东西,回头来还是似懂非懂,呵呵,这是我的个人感受了..

 回复 引用   
#10楼2006-09-07 14:29 | 邓古谚[未注册用户]
请问有这本书的电子版吗?找了很多地方都没找到,如果有的话能发给我一本吗?多谢了 flyin2006@etang.com