博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈值类型和引用类型
阅读量:4330 次
发布时间:2019-06-06

本文共 1751 字,大约阅读时间需要 5 分钟。

      菜鸟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:)

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

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

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

     从string的Equals()方法不难看出string在相等的判断上不仅有地址的判断,还有值的判断。从方式上比较偏向值类型的判断方式。而且String重载了==和!=两个操作符,使string在使用上更加接近值类型。(注意string是String类型的别名)操作符重载详细参见:

      值类型和引用类型的区别:

      值类型在初始化的时候,会调用隐式构造函数,赋默认值。默认值表如下:

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

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

      本文只是抛砖之作,更多精深内容在此: 

      菜鸟D希望这篇文章对您有所帮助。

转载于:https://www.cnblogs.com/cnDqf/p/4119232.html

你可能感兴趣的文章
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
ajax跨域,携带cookie
查看>>
阶段3 2.Spring_01.Spring框架简介_03.spring概述
查看>>
阶段3 2.Spring_02.程序间耦合_1 编写jdbc的工程代码用于分析程序的耦合
查看>>
阶段3 2.Spring_01.Spring框架简介_04.spring发展历程
查看>>
阶段3 2.Spring_02.程序间耦合_3 程序的耦合和解耦的思路分析1
查看>>
阶段3 2.Spring_02.程序间耦合_5 编写工厂类和配置文件
查看>>
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_02.程序间耦合_4 曾经代码中的问题分析
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>