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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孤神法法 中级黑马   /  2014-3-17 13:00  /  1245 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孤神法法 于 2014-3-20 15:32 编辑

值类型和引用类型有什么区别?

4 个回复

倒序浏览
1.将一个值类型变量赋值给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象的本身;
2.值类型不可以派生新的类型:所有的值类型均隐士派生自System.ValueType。但与引用类型相同的是,结构也可以实现接口;
3.值类型不可以包含null值;然而,可空类型功能允许将null赋值给值类型;
4.每种值类型均有一个隐士的默认构造函数来初始化该类型的默认值。
回复 使用道具 举报
值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。
因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向
同一地址,从而发生相互影响。
C#的值类型包括:整数类型、字符类型、实数类型和布尔类型、结构(struct)类型和枚举(enum)类型。
C#的引用类型包括:数组、用户定义的类、字符串等。

回复 使用道具 举报
一、值类型主要由两类组成:结构和枚举;结构分为:Numeric(数值)类型(整型。浮点型,Decimal、Bool、用户定义的结构)
值类型的主要功能:基于值类型的变量直接包含值。 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自 System.ValueType。
与引用类型不同,不能从值类型派生出新的类型。 但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型无法包含 null 值。 但是,可以为 null 的类型 功能允许值类型分配给 null。
二、引用类型:变量存储对实际数据的引用;
引用类型关键字:class、interface、delegate。
回复 使用道具 举报
c#的两大数据类型分别为值类型和引用类型。
值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但是当被问及到二者之间的联系和区别,什么时候用struct什么时候用class时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。
值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。
C# 的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡使用它,同时也要尽量避免隐式装拆箱的发生。
注:栈是操作系统分配的一个连续的内存区域,用于快速访问数据。因为值类型的容量是已知的,因此它可存储在栈上。而托管堆是CLR在应用程序启动时为应用程序预留的一块连续内存区,是用于动态内存分配的内存区,引用类型的容量只有到运行时才能确定,所有用堆来存储引用类型。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马