标签:style blog http ar color os 使用 sp 数据
菜鸟D在看书的时候,无意中看见说string是值类型(事后发现是在《大话设计模式》P84第九章第五节),感觉脑袋一懵,string不是引用类型吗,怎么成了值类型?string真的是值类型?不对,string就是引用类型。连这种基础问题都需要想一下,看来改温故知新了。
重新看一下值类型和引用类型这两个基础问题(越是基础的问题越是坑人啊)。
通用类型系统(common type system,CTS)支持两种一般类别的类型:值类型和引用类型。
值类型包括基本数据类型(如整型:int;长整型:long;短整型:short;浮点型:float;字符型:char等)也叫内置值类型(有些是系统内置结构的别称,如long),枚举类型(enum),结构类型(struct,结构也被成为用户自定义的值类型)。常用的值类型有DateTime,int ,float,double,bool,char等。
引用类型包括接口,数组,类三大类。其中类又可以分为基类(object),字符串(string),自定义类(class)三类。如果感觉上述内容比较乱,看图可能会更好一点:(图片出自msdn:http://msdn.microsoft.com/zh-cn/library/2hf02550(v=vs.80).aspx)
所有的类型都是继承object基类,值类型继承ValueType ,而ValueType 也继承object基类。
ValueType 是一个抽象类,其本身是一个类类型(有点拗口),不是值类型而是引用类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。通过反编译我们可以看到ValueType重写后的Equals()方法。
(此处反编译的是string的Equals方法):
从string的Equals()方法不难看出string在相等的判断上不仅有地址的判断,还有值的判断。从方式上比较偏向值类型的判断方式。而且String重载了==和!=两个操作符,使string在使用上更加接近值类型。(注意string是String类型的别名)操作符重载详细参见:http://msdn.microsoft.com/zh-cn/library/ff986396(v=vs.110).aspx
值类型和引用类型的区别:
值类型在初始化的时候,会调用隐式构造函数,赋默认值。默认值表如下:http://msdn.microsoft.com/zh-cn/library/83fhsxwc.aspx
引用类型必须初始化以后才可以调用。
引用类型是可以派生新类型的,string除外,string是sealed密封的。值类型不能派生新类型。
结构和引用类型都可以实现接口。
引用类型可以为空,值类型不可以。某些情况下值类型需要为空,便有了可空值类型,如int?。作为参数时,值类型将自己本身复制一份,将复制的结果传过去,引用类型将自己的引用地址传递过去。当需要将值类型的地址传过去时,通常使用ref和out,这样会修改值类型的本身。如下例:
int a = 1; change(ref a); Console.WriteLine(a); Console.WriteLine("-----------------------------------"); int b = 1; change(b); Console.WriteLine(b); private static void change(ref int i) { i++; Console.WriteLine(i); } private static void change(int i) { i++; Console.WriteLine(i); }
通常的,我们都认为值类型分配在栈上,而引用类型分配在堆上。但是在细微之处是略有区别的,比如一个复杂结构中有一个自定义类的变量,那么该变量应该分配在堆上还是栈上?这个问题菜鸟D回答不了,也希望有人可以为菜鸟D解惑。
本文只是抛砖之作,更多精深内容在此:http://www.dwww.cn/News/2008-3/2008331712296595.shtml
菜鸟D希望这篇文章对您有所帮助。
标签:style blog http ar color os 使用 sp 数据
原文地址:http://www.cnblogs.com/cnDqf/p/4119232.html