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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大牙到潍坊 中级黑马   /  2013-12-1 18:49  /  1646 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大牙到潍坊 于 2013-12-3 12:55 编辑

值类型和引用类型的区别?求详细解释

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

10 个回复

倒序浏览
类型的类别:

值类型

值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。值类型可以是内联的(由运行库实现)、用户定义的或枚举的。有关内联值类型的列表,请参见 .NET Framework 类库。

引用类型

引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。引用类型的类型可以由自描述类型的值来确定。自描述类型进一步细分成数组和类类型。类类型是用户定义的类、装箱的值类型和委托。

作为值类型的变量,每个都有自己的数据副本,因此对一个变量的操作不会影响其他变量。作为引用类型的变量可以引用同一对象;因此对一个变量的操作会影响另一个变量所引用的同一对象。

所有类型都派生自 System.Object 基类型。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
值类型主要由两类组成:

        结构

        枚举

结构分为以下几类:

        Numeric(数值)类型

                整型

                浮点型

                decimal

        bool

        用户定义的结构。


值类型的主要功能

基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

所有的值类型均隐式派生自 System.ValueType。

与引用类型不同,可以从值类型派生出新的类型。但与引用类型相同的是,结构也可以实现接口。

与引用类型不同,值类型无法包含 null 值。然而,可译为 null 的类型功能确实允许将 null 赋给值类型。

每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

简单类型的主要功能
所有的简单类型(C# 语言的组成部分)均为 .NET Framework 系统类型的别名。例如,int 是 System.Int32 的别名。

编译时计算操作数均为简单类型常数的常数表达式。

可使用文字初始化简单类型。例如,“A”是 char 类型的文字,而 2001 是 int 类型的文字。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
值类型只需要一段单独的内存(栈),用于存储实际的数据
引用类型需要两端内存:(object,string,class,interface,delegate,array)
        第一段存储实际的数据,它位于堆中
        第二段是一个引用(栈中),指向数据在堆中的存放位置

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
值类型的话,即使两个变量的值一样,系统还是会在内存中为他们分配不同的内存位置。当他们中的一个发生改变时,另一个完全不受影响。
引用类型的话,两个变量的值一样时,系统会为他们分配同一个内存位置,然后用指针将他们指向那个位置。
当这个内存中的值发生变化时,会影响到所有指向这个内存的变量。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
1.内存分配: 值类型是分配在栈中的;而引用类型是分配在堆中。

2.效率: 值类型效率高,不需要地址转换;引用类型效率较低,需要进行地址转换。

3.内存回收: 值类型使用完后立即回收;引用类型使用完后不立即回收,而是交给GC处理回收。

4.赋值操作: 值类型是创建一个新对象;引用类型创建一个引用。

5.类型扩展: 值类型不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型;引用类型具有多态的特性方便扩展。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
值类型存储在栈中,他所代表的就是他实际的值;而引用类型的实际值存储在托管堆中,在栈中的变量存储应用类型的地址,也就是说:值类型A->存储实际值B;引用类型C->存储引用对象E的地址D->D存储引用对象E

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
许杰 中级黑马 2013-12-2 11:24:50
8#
值类型:
单元直接存放“有效值”
如:
int a=3;
则a内存单元就放的是3

引用类型:
单元放的是另外一个对象的引用(地址)
如:
Student stu1=new Student();
就是说,在内存中开辟了一个对象new Student(),stu1内存单元存放的是那个对象的地址,并非对象本身

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
V_John 中级黑马 2013-12-2 12:30:12
9#
如果问题得到解决,请修改为已解决
回复 使用道具 举报
区别: 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、值类型有两种状态:装箱和未装箱,运行库提供了所有值类型的已装箱形式;而引用类型通常只有一种形式:装箱。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1 额,回答的很好,排列的有序些好看点.

查看全部评分

回复 使用道具 举报
1.    值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2.     值类型存取速度快,引用类型存取速度慢。
3.     值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4.     值类型继承自System.ValueType,引用类型继承自System.Object
5.     栈的内存分配是自动释放;而堆在.NET中会有GC来释放      
6.      值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
7. 值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际
数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储
可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量
占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两
个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用
,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,
因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这
个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保
存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

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