c#中值类型和引用类型的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中值类型和引用类型的区别相关的知识,希望对你有一定的参考价值。

最好能举例说明一下

(1)值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。
(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、引用类型:复制代码。
参考技术A

1、速度上的区别

值类型存取速度快,引用类型存取速度慢。

2、用途上的区别

值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用。

3、来源上的区别

值类型继承自System.ValueType,引用类型继承自System.Object

4、位置上的区别

值类型的数据存储在内存的栈中,引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。

5、类型上的区别

值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

6、保存位置上的区别

值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。

例如:

字符串类型,而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。

由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。

在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,

如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

参考技术B

值类型、引用类型区别:

    值类型内容存储在(栈)上。引用类型指针存储在(栈)上,内容存储在(堆)上。

    值类型和引用类型最大的不同是:传递的效率和影响:效率指:软件运行时,复杂功能在大量运算,毫秒级上内存一直在复制和分配,一组数据的值拷贝和指针拷贝,cpu性能和内存表现差异大,影响指:修改方法里的数据会不会影响到方法外的数据对象。

    值类型=其他变量时是复制内容(替换栈内容),引用类型=其他变量时是替换指针(替换栈指针)。

    值类型赋值时(例=1)是替换内容(替换栈内容),引用类型=new时是新分配内存(新分配堆内存)和替换指针(替换栈指针)。

    值类型在方法传递参数过程中是复制1份内容(新分配栈内容),引用类型在方法传递过程中是复制1个指针(新分配栈指针),指向同1个内容,内容没复制。

    值类型在方法里修改不影响方法外变量,引用类型在方法里修改,因为指向同1个内容,方法外的值也同步变化。

字符串是特殊的引用类型:

    字符串是特殊的引用类型,每次=新字符串实际都改变一次栈指针(新分配堆内存,替换栈指针),而没有改变值。

    字符串传给方法是1个指针(新分配栈指针)。方法内=新字符串是替换方法内的指针(替换新栈指针),不影响方法外的指针(不影响原栈指针),所以表现看过去与值传递一致。

结构体struct值类型、class引用类型区别:

 结构体struct是值类型,但是结构体中的字符串、数组、类存放的是指针,和值一起存在栈上。

   所谓值类型, 结构体的表现就是传给方法是复制1套指针和1套值,在方法内修改结构体1级属性(修改结构体字符串、new数组、new类)改的是方法内结构体的指针(1级指针),无法改变方法外结构体的指针,所以不影响方法外的结构体,但是修改数组内数据和类属性会影响方法外的结构体(因为改的是1级指针指向的内容)。

    class是引用类型,传给方法是1个指针。方法内替换属性会影响方法外的对象(因为修改的是指针指向的内容)。但是方法内再次=new对象是替换方法内的对象指针,不影响方法外的对象,再替换属性就不影响方法外的对象。

参考技术C 每一个值类型都有一个独立的内存区域保存自己的值,调用它的时候调用的是他的值,而应用类型调用的是内存中的地址。
比如a1=18,这时候在内存中保存的是18,当把a1赋值给a2的时候,他们两个引用的是同一个内存空间,a2的值会保存为a1的值,当把a2改为20后,因为a1和a2引用的是同一个内存地址,所以a1也变成20,这是引用类型。
值类型是当把a1赋值给a2时,会为a2再开一块新的内存空间保存a1的值。当把a2改成20时,只会在a2的空间保存20,和a1没关系了。本回答被提问者采纳
参考技术D 值类型都是深拷贝,就是把内存中的数据赋值给另一快内存。
引用类型都是浅拷贝,就是被指向一块内存的地址拷贝给了另一个引用。
值类型用=是值传递
会在内存中在开辟一块新的内存,
比如
int
a
=
1;
int
b
=
a;
内存中就开了2快内存分别是a和b,结构也是值类型
所以没问题。问题在于类,如果你没有写“=”号赋值运算符,那么student3
=
student4;让student3也指向student4的内存,然后你再给student4这块内存赋值20
那么student3就也等于20了。而且ClassStudent
student3
=
new
ClassStudent();这块内存,如果没有.net的垃圾回收的话,在C++中就是内存泄露了。

c#中值类型与引用类型的值传递与引用传递

值类型:结构体,数值类型(int,double,char,),bool型,枚举,可空类型(nullable)

引用类型:数组,用户定义的类、接口、委托,object,字符串

值类型存储在内存里的栈里,引用类型存储在内存里的堆里。

值传递时,形参到实参实质上是栈里的内容复制,引用传递时,形参到实参实质上栈内容地址的复制。

 

以上是关于c#中值类型和引用类型的区别的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中值类型和引用类型的区别

java中值类型和引用类型的区别

Java中值类型和引用类型的区别

c#中值类型与引用类型的值传递与引用传递

Java中值类型和引用类型的区别

值类型和引用类型