黑马程序员技术交流社区
标题:
值类型和引用类型的区别?
[打印本页]
作者:
大牙到潍坊
时间:
2013-12-1 18:49
标题:
值类型和引用类型的区别?
本帖最后由 大牙到潍坊 于 2013-12-3 12:55 编辑
值类型和引用类型的区别?求详细解释
作者:
yuanlianxi03
时间:
2013-12-1 18:57
类型的类别:
值类型
值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。值类型可以是内联的(由运行库实现)、用户定义的或枚举的。有关内联值类型的列表,请参见 .NET Framework 类库。
引用类型
引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。引用类型的类型可以由自描述类型的值来确定。自描述类型进一步细分成数组和类类型。类类型是用户定义的类、装箱的值类型和委托。
作为值类型的变量,每个都有自己的数据副本,因此对一个变量的操作不会影响其他变量。作为引用类型的变量可以引用同一对象;因此对一个变量的操作会影响另一个变量所引用的同一对象。
所有类型都派生自 System.Object 基类型。
作者:
yuanlianxi03
时间:
2013-12-1 19:07
值类型主要由两类组成:
结构
枚举
结构分为以下几类:
Numeric(数值)类型
整型
浮点型
decimal
bool
用户定义的结构。
值类型的主要功能
基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自 System.ValueType。
与引用类型不同,可以从值类型派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型无法包含 null 值。然而,可译为 null 的类型功能确实允许将 null 赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
简单类型的主要功能
所有的简单类型(C# 语言的组成部分)均为 .NET Framework 系统类型的别名。例如,int 是 System.Int32 的别名。
编译时计算操作数均为简单类型常数的常数表达式。
可使用文字初始化简单类型。例如,“A”是 char 类型的文字,而 2001 是 int 类型的文字。
作者:
黑马—严守卫
时间:
2013-12-1 19:37
值类型只需要一段单独的内存(栈),用于存储实际的数据
引用类型需要两端内存:(object,string,class,interface,delegate,array)
第一段存储实际的数据,它位于堆中
第二段是一个引用(栈中),指向数据在堆中的存放位置
作者:
第六天魔王
时间:
2013-12-1 20:06
值类型的话,即使两个变量的值一样,系统还是会在内存中为他们分配不同的内存位置。当他们中的一个发生改变时,另一个完全不受影响。
引用类型的话,两个变量的值一样时,系统会为他们分配同一个内存位置,然后用指针将他们指向那个位置。
当这个内存中的值发生变化时,会影响到所有指向这个内存的变量。
作者:
姐的霸气谁懂
时间:
2013-12-1 21:31
1.内存分配: 值类型是分配在栈中的;而引用类型是分配在堆中。
2.效率: 值类型效率高,不需要地址转换;引用类型效率较低,需要进行地址转换。
3.内存回收: 值类型使用完后立即回收;引用类型使用完后不立即回收,而是交给GC处理回收。
4.赋值操作: 值类型是创建一个新对象;引用类型创建一个引用。
5.类型扩展: 值类型不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型;引用类型具有多态的特性方便扩展。
作者:
不明觉厉
时间:
2013-12-2 10:42
值类型存储在栈中,他所代表的就是他实际的值;而引用类型的实际值存储在托管堆中,在栈中的变量存储应用类型的地址,也就是说:值类型A->存储实际值B;引用类型C->存储引用对象E的地址D->D存储引用对象E
作者:
许杰
时间:
2013-12-2 11:24
值类型:
单元直接存放“有效值”
如:
int a=3;
则a内存单元就放的是3
引用类型:
单元放的是另外一个对象的引用(地址)
如:
Student stu1=new Student();
就是说,在内存中开辟了一个对象new Student(),stu1内存单元存放的是那个对象的地址,并非对象本身
作者:
V_John
时间:
2013-12-2 12:30
如果问题得到解决,请修改为已解决
作者:
大牙到潍坊
时间:
2013-12-2 13:19
区别: 1、值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高。 2、引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例。 3、值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object。 4、值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量保存了其数据的引用地址,因此以引用方式进行参数传递时会影响到参数本身,因为两个变量会引用了内存中的同一块地址。 5、值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式。我会在下节以专门的篇幅来深入讨论这个话题。 6、典型的值类型为:struct,enum以及大量的内置值类型;而能称为类的都可以说是引用类型。 7、值类型的内存不由GC(垃圾回收,Gabage Collection)控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,由GC来完成,微软甚至建议用户最好不要自行释放内存。 8、值类型是密封的(sealed),因此值类型不能作为其他任何类型的基类,但是可以单继承或者多继承接口;而引用类型一般都有继承性。 9、值类型不具有多态性;而引用类型有多态性。 10、值类型变量不可为null值,值类型都会自行初始化为0值;而引用类型变量默认情况下,创建为null值,表示没有指向任何托管堆的引用地址。对值为null的引用类型的任何操作,都会抛出NullReferenceException异常。 11、值类型有两种状态:装箱和未装箱,运行库提供了所有值类型的已装箱形式;而引用类型通常只有一种形式:装箱。
作者:
许杰
时间:
2013-12-3 09:18
1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2. 值类型存取速度快,引用类型存取速度慢。
3. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4. 值类型继承自System.ValueType,引用类型继承自System.Object
5. 栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6. 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
7. 值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际
数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储
可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量
占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两
个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用
,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,
因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这
个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保
存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2