A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴水平 中级黑马   /  2012-7-7 14:00  /  2269 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C#中的值类型和引用类型有什么区别?引用类型跟C语言的指针有啥区别

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

6 个回复

正序浏览
首先:存储空间不同,值类型存储在栈空间里,引用类型存储在堆空间里;栈空间是用来存放经常用到的或所需存储空间较小的对象或代码,堆空间是存放所占空间较大的对象
其次:值类型变量里存放的是值,引用类型变量里存放的是该对象所存放的堆空间地址,
再次:值类型是基本数据类型,引用类型是由基本数据类型定义的数据类型,即用户自定义数据类型
回复 使用道具 举报
值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
第一、值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
第二、从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
第三、值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。
第四、C# 的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡使用它,同时也要尽量避免隐式装拆箱的发生。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
我的理解是: 值类型直接存储数据……引用类型间接存储数据,感觉和指针是一个意思……

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
值类型变量直接包涵其本身的数据,引用类型变量不包含数据,只是存储对数据的引用,数据保存在内存的其他位置。例如:
  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, 下载次数: 26)

xx.jpg

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
值类型存取速度快,引用类型存取速度慢。
他们的基本区别在于在内存中的存储方式,值类型只将值存放在内存中,引用类型的内存单元只存放内存堆中对象的地址
值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马