twobug love Nike

成功后,受过再多的苦都是甜

导航

CLR学习笔记一:CTS

   
首先这篇文章是自己对初步学习CLR中CTS的粗浅理解,希望各位能补充要点
    CTS解决了了各个编程语言之间对类型的定义不一致的问题,使.Net平台上的语言使用同一个类型系统,这样就使得多语言的互操作变的简单,使不同语言定义的类型可以在各个语言中使用或者继承。
    CTS有两个子系统,分别是值类型系统和引用类型系统(这里有一个比较的问题,也就是==和Equals以及ReferenceEquals的区别,这里有篇文章讲了大概的区别,我认为没有写的很清楚。在文章后面我希望能把这个问题讲到透彻的程度),
    其中引用类型系统中只有两个内置类型,分别是Object和String(FCL中为System.Object和System.String),一切从Object派生的类型都被定义为用户定义类型。其中String类型是密封的,不可变的。密封性就是说不可继承,不可变性说的是一旦在垃圾回收堆上分配了一个对象空间,那么这块空间将不可变动,一切对String类型字符串的修改都将在垃圾回收堆上重新分配空间,所以如果程序对字符串的修改比较频繁的话,最好用StringBuilder类,可以大大减小开销。还有个指针类型,平时也没怎么用过,以为和C++的差不多,今天看书才知,托管环境中不兼容非托管指针,只可以使用非托管函数指针,这现在我还用不到,留着以后体验。在值类型上使用接口会发生装箱。

下面说下==和Equals以及ReferenceEquals的区别
1.引用类型间==比较的是比较的两个引用类型所引用的对象是否相等,也就是是不是引用垃圾回收堆中的同一个对象。Equals和ReferenceEquals在比较引用类型时与==执行相同的操作 ,这时Equals是调用的Object.Equals()方法实现。
2.值类型间:==和Equals运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等,但此时Equals调用的是Object.ValueType提供,并使用反射进行比较,速度慢很多。由于ReferenceEquals是Object提供的用于比较两个引用之间的方法,所以在比较值的时候总是返回false,因为值类型在装箱后在堆中地址总是不同的(对于int a=2;int b=2这样的两个比较我保留意见,不知道是否也返回false,现在用的不是自己的电脑,回去实验后补充,也请各位补充)。
3.特别注意:a.对于String对象,当声明的字符串相同时,在垃圾回收堆上只保留一个备份。b.当==不能判断所比较的是不是字符串的引用时,将会调用它的恒等(identity)版本

更新:对于int a=2;int b=2这样的两个值在用ReferenceEquals比较时,仍然返回false,因为在装箱后,两个值类型被装箱到与int对应的装箱类型中,而不是String类型,所以返回false.如果是a.ToString()与b.ToString()比较也同样道理,并不是ToString()后就变为String类型了

posted on 2005-09-25 11:38  twobug  阅读(796)  评论(4编辑  收藏  举报