黑马程序员技术交流社区

标题: C#中的值类型和引用类型区别 [打印本页]

作者: 戴水平    时间: 2012-7-7 14:00
标题: C#中的值类型和引用类型区别
C#中的值类型和引用类型有什么区别?引用类型跟C语言的指针有啥区别
作者: 许楠    时间: 2012-7-7 14:20
值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
值类型存取速度快,引用类型存取速度慢。
他们的基本区别在于在内存中的存储方式,值类型只将值存放在内存中,引用类型的内存单元只存放内存堆中对象的地址
值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
作者: 文硕    时间: 2012-7-7 18:24
值类型变量直接包涵其本身的数据,引用类型变量不包含数据,只是存储对数据的引用,数据保存在内存的其他位置。例如:
  1. class Test
  2.         {
  3.             public int a;
  4.         }
  5.         static void Main(string[] args)
  6.         {
  7.             int x = 10, y = x;
  8.             Test t1 = new Test();
  9.             Test t2 = t1;
  10.             Console.WriteLine("x=" + x + " y=" + y + "\nt1.a=" + t1.a + " t2.a=" + t2.a);
  11.             y = 100;
  12.             t2.a = 10;
  13.             Console.WriteLine("x=" + x + " y=" + y + "\nt1.a=" + t1.a + " t2.a=" + t2.a);
  14.             Console.ReadKey();
复制代码
观察对象与变量值的变化。

xx.jpg (9.54 KB, 下载次数: 21)

xx.jpg

作者: 钱灿    时间: 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