码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈值类型和引用类型

时间:2014-11-24 19:06:08      阅读:220      评论:0      收藏:0      [点我收藏+]

标签: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

bubuko.com,布布扣

      所有的类型都是继承object基类,值类型继承ValueType  ,而ValueType  也继承object基类。

      ValueType  是一个抽象类,其本身是一个类类型(有点拗口),不是值类型而是引用类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。通过反编译我们可以看到ValueType重写后的Equals()方法。

bubuko.com,布布扣

(此处反编译的是string的Equals方法):

bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣

     从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

bubuko.com,布布扣

      引用类型必须初始化以后才可以调用。

  引用类型是可以派生新类型的,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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!