《Effective C#》读书心得(一)

       花了两天时间坐在电脑面前,把这本书的Chapter 1 C# Language Elements看完了,反正也是磕磕碰碰,好多地方似懂非懂的看着,写下一点读书小节吧。
       1、定义一个类型时,字段一般是private的,在JAVA中我们会专门写两个方法:
set~()、get~()来把一个字段封装起来,但是在C#里有个叫属性的机制,可以更好的将字段封装,如下:
   private string _name;
   public string Name
   {
       get
       {
           return _name;
       }
       set
       {
           _name = value;
       }
   }
        这样显然的好处是我们在要重命名_name变量时,只需要修改少量的代码就可以使程序正常运行。当然,如果我们舍去set块,如:
 private string _name;
 public string Name
 {
    get
    {
        return _name;
    }
 }
        这样外部代码就只能读取_name的值,而不能通过class.Name = "abc";这样的语句来给_name赋值了。C#的这个机制在我刚接触他的时候就开始使用了,算是一个与JAVA的区别吧。

       2、定义一个类型时,应尽量重写ToString()方法。延用object类的ToString()方法,返回的值对我们用处不大,如我定义一个直接继承自object类的MyType类,它的ToString()方法返回的仅仅是“命名空间.Mype”这样的字符串。
   
       3、值类型与引用类型的区别,在书上了解到,C++的变量都是值类型的,只是在需要时才转换成引用类型,这样无疑是高效率的,但也是难以控制的。而JAVA里就全是引用类型的数据,通过垃圾收集机制来排除多余的变量。C#里,两着皆有,典型的值类型有int、float、double,bool等等,当然struct也是值类型的,而其他的具有class结构的都属于引用类型,其中string算是一种很特殊的引用类型。值类型存储在堆栈中,读取速度很快,而引用类型是用一个存储在堆栈中的指针指向堆中的一块地址,因此使用引用类型要小心,比如:Mytype a = new Mytype();  Mytype b = a;   这样两个变量声明,其实质是第一条语句在堆栈中创建一个a指针,它指向堆中的一块地址,第二条语句只是在堆栈中创建一个b指针,它还是指向a指针指向的那一块地址。如果我们改变变量a的内容,那么变量b也同样改变。又如我们创建一个数组:int[] a = new int[10];  再把这个数组复制到数组b:int[] b = Array.Copy(a);  上学期在做数据结构实验的时候,我用多个数组进行不同方法的排序,多个数组就是通过上面的方法复制而来,结果发现本来效率很低的算法排序时间反而更短,最后发现问题就出现在引用类型上,我复制的只不过是数组的引用,实质上数组在堆中只创建了一次,结果在第一次排序完成后(效率高的算法在前),等到后面用效率低的算法时,数组内已经是排序好的了,排序时间自然就短了。
        定义一个类型的时我们究竟是选择struct还是class,在这本书里好象有点启发了,以前总认为重量级的类型就该使用class,其实不然,只要同时满足以下几个条件就可以用struct,而不是class:一、该类型只是起存储数据的作用;二、该类型的变量的值在实例化以后是不需要改变的;三、该类型永远不会被其他类型继承;四、该类型永远不会呈现多态性。

      4、在遍历集合时,尽量使用foreach语句,下面三种循环:
     int[] test = new int[100];
      //1:
      foreach(int i in text)
         dosomething;
      //2:
      for(int index = 0;index<test.Length;index++)
         dosomething;
      //3:
       int len = test.Length;
       for(int index = 0;index<len;index++)
         dosomething;
      其中3的效率最低,而1又高于2,并且1的表达也更加简洁。其实2、3的代码效果是这样的:
       int len = test.Length;
       for(int index = 0;index<len;index++)
       {
           if(index < test.lenth)
              dosomething;
           else
               throw new IndexOutofRangeException();
       }
     因此其效率就显得底下了。
     在即时编译的时候,JIT可以自动检测出数组的上下界,因此我们不需要指定循环的次数,这些都让foreach语句告诉CLR去完成了。
      除了遍历一维数组,foreach语句还可以作用在多维数组上。可以说foreach语句的功能很强大,可惜JAVA里好象没有~

    其实还学到了其他几点知识,但是还是觉得上面几点比较重要。还发现英语真不是背单词那么简单的!一个句子单词都认识有时候都好难理解!难搞啊~~~~~
    抓紧时间!马上断网! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值