C#值类型和引用类型的区别
2022-11-07 · 百度认证:IT168官方账号,优质数码领域创作者
(2)引用类型:对象、数组、函数。
1、值类型:包括:sbyte、short、int、long、float、double、decimal(以上值类型有符号)byte、ushort、uint、ulong(以上值类型无符号)bool、char
2、引用类型:包括:对象类型、动态类型、字符串类型。二、具体区别:
1、值类型:byteb1=1;byteb2=b1;Console.WriteLine("{0},{1}。",b1,b2);b2=
2;Console.WriteLine("{0},{1}。",b1,b2);Console.ReadKey();解释:byteb1=1;声明b1时,在栈内开辟一个内存空间保存b1的值1。byteb2=b1;声明b2时,在栈内开辟一个内存空间保存b1赋给b2的值1。Console.WriteLine("{0},{1}。",b1,b2);输出结果为1,1。b2=2;将b2在栈中保存的值1改为
2。Console.WriteLine("{0},{1}。",b1,b2);输出结果为1,2。
2、引用类型:复制代码。
如果你学过C/C++的话,这点很容易理解,C#中的一个重要特征就是所有一切资源都可以抽象为类,并可实例化对象,包括基本数据类型,所有一切类的基类是Object,因此C#是完全面向对象的语言。
在C/C++中,“int,byte,long,bool,char ..."这些类型虽然不是真正意义上的类,但是从某种角度看,其实也具有类的某些特征,比如你可以把int看做编译器内置的一个类,当你int a进行定义变量时,等于用int类创建了一个称作a的对象,只是C#告诉你,int就是个类,它有自己的方法和属性,比如ToString(),而且所有的类型都继承于Object类,而C/C++中没有这么彻底。
C/C++中,你可以直接用基本变量类型创建一个变量,变量名指代一个系统分配的地址,当使用变量名操作时可以直接操作数据,因此这种类型可以叫做值类型,只不过由于C/C++中根本没把基本类型表示为类所以也没有值类型这种表述,直接定义变量时,变量被分配在栈上,叫做静态分配。而当我们在定义一个指针变量时,比如100个元素的动态数组: int *p=new int[100],或者动态分配一个变量并初始化: int *p=new int(10),都是在程序运行时分配到堆上面的,并且把地址赋值给指针p。
说这些C/C++的概念是想告诉你,C#中的值类型和引用类型就是和C/C++静态分配和动态分配是一样的。C#中的值类型,它可以定义后直接使用(不需要new,没有指针),分配在栈上;引用类型其实就是将指针和所指内存块以及其他额外数据封装了,因为在C#中全面对象化,对用户不可见。但是本质还是一样的,因此值类型( int a=10 ) 就是直接进行分配内存后存储,而引用类型必须进行装箱:object o=10,装箱的过程就是在堆上分配一个内存块,存放a的值以及其他额外数据并返回地址,也就是对象的引用赋值给o,而你是不可以直接将o按指针来操作的(所以称为引用)。由于基本类型是内置的,所以这类对象的创建不需要显式去new,当然你一定要自己new也不会错 object o=new int(),因为C#是完全面向对象的,一切的实体都可以new,创建格式标准化的(除了接口,因为它没有实体)。
最后说说值类型,由于C#一切都是面向对象的,因此就算是值类型也是个类,因此基本类型升级后C/C++中很简单变量升级为结构,以满足面向对象统一接口,因为C/C++中类的本质就是结构的升级版(增加了函数),而C#中的值类型的存在为了效率,所以采用静态结构体。虽然这两种语言是完全不同的语言,但是血缘上还是有关系的,有些地方可以互通和借鉴,这个可以帮助我们方便的理解和学习。
下图为VS2010 C#中 右键查int类型的定义,注意是struct,值类型,结构的特点就是静态和效率,所以C#中基本类型都是结构:
下图为VS2010 C#中 右键查object类型的定义,注意是class,其特点就是动态和灵活,所以C#中引用类型都是类: