浅谈值类型和引用类型

      菜鸟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希望这篇文章对您有所帮助。