黑马程序员技术交流社区
标题:
C#中的值类型和引用类型区别
[打印本页]
作者:
戴水平
时间:
2012-7-7 14:00
标题:
C#中的值类型和引用类型区别
C#中的值类型和引用类型有什么区别?引用类型跟C语言的指针有啥区别
作者:
许楠
时间:
2012-7-7 14:20
值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
值类型存取速度快,引用类型存取速度慢。
他们的基本区别在于在内存中的存储方式,值类型只将值存放在内存中,引用类型的内存单元只存放内存堆中对象的地址
值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
作者:
文硕
时间:
2012-7-7 18:24
值类型变量直接包涵其本身的数据,引用类型变量不包含数据,只是存储对数据的引用,数据保存在内存的其他位置。例如:
class Test
{
public int a;
}
static void Main(string[] args)
{
int x = 10, y = x;
Test t1 = new Test();
Test t2 = t1;
Console.WriteLine("x=" + x + " y=" + y + "\nt1.a=" + t1.a + " t2.a=" + t2.a);
y = 100;
t2.a = 10;
Console.WriteLine("x=" + x + " y=" + y + "\nt1.a=" + t1.a + " t2.a=" + t2.a);
Console.ReadKey();
复制代码
观察对象与变量值的变化。
xx.jpg
(9.54 KB, 下载次数: 21)
下载附件
2012-7-7 18:22 上传
作者:
钱灿
时间:
2012-7-7 19:01
我的理解是: 值类型直接存储数据……引用类型间接存储数据,感觉和指针是一个意思……
作者:
杨正
时间:
2012-7-7 21:59
第一、值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
第二、从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
第三、值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。
第四、C# 的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡使用它,同时也要尽量避免隐式装拆箱的发生。
作者:
魏振龙
时间:
2012-7-7 22:13
值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)。
作者:
侯慧杰
时间:
2012-7-8 16:50
首先:存储空间不同,值类型存储在栈空间里,引用类型存储在堆空间里;栈空间是用来存放经常用到的或所需存储空间较小的对象或代码,堆空间是存放所占空间较大的对象
其次:值类型变量里存放的是值,引用类型变量里存放的是该对象所存放的堆空间地址,
再次:值类型是基本数据类型,引用类型是由基本数据类型定义的数据类型,即用户自定义数据类型
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2