花了两天时间坐在电脑面前,把这本书的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里好象没有~
其实还学到了其他几点知识,但是还是觉得上面几点比较重要。还发现英语真不是背单词那么简单的!一个句子单词都认识有时候都好难理解!难搞啊~~~~~
抓紧时间!马上断网!