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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蛋壳 中级黑马   /  2014-1-13 01:44  /  1742 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

值类型与引用类型传参区别有哪些呢?

11 个回复

倒序浏览
值类型是拷贝传参,在栈空间从新开辟一块空间,传递过后两个变量指向的是两个互不相关的对象,也就是指向的栈空间中两个互不相关的内存空间,其中一个值改变,另一个不会变

引用类型变量的值是存放在堆内存空间的,所占的大小是不固定的,在栈空间存放的是对象在堆内存空间的地址编号,传递后两个变量中的值是一样的,指向的是堆内存中同一个对象,也就是同一个地址块,其中一个值改变,另一个也会改变
回复 使用道具 举报
1.    值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
3.值类型继承自System.ValueType,引用类型继承自System.Object
4.值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。      注意:string是个特殊引用类型 。只不过它在某此操作上会表现出值类型的特征.
C# string 特殊引用类型    详见: http://www.cnblogs.com/tling091223/archive/2009/12/23/1630338.html
回复 使用道具 举报
1.     值类型直接存储其值,  变量本身就包含了其实例数据,  而引用类型保存的只是实例数据的内存引用。   因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向  同一地址,从而发生相互影响。      2.     从内存分配上来看,  值类型通常分配在线程的堆栈上,  作用域结束时,  所占空间自行释放,  效率高,   无需进行地址转换,而引用类型通常分配在托管堆上,由  GC  来控制其回收,需要进行地址转换,效  率降低,这也正是  c#  需要定义两种数据类型的原因之一。      3.     值类型均隐式派生自  System.ValueType  ,  而  System.ValueType  又直接派生于  System.Object,   每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封  (  sealed  )的,所以无法派生出新的值类型。而且  System.ValueType  本身是一个类类型,而不  是值类型,因为它重写了  object  的  Equals()  方法,所以对值类型将按照实例的值来比较,而不是  比较引用地址。      4.     C#   的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱   需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡  使用它,同时也要尽量避免隐式装拆箱的发生。   
回复 使用道具 举报
值类型是拷贝传递,引用类型是地址传递,比较经典的话,
回复 使用道具 举报
所有.NET的类型都可以分为两类:值类型和引用类型。最简单最明确的区别标准是:所有的值类型都继承自System.ValueType,也就是说所有继承自System.ValueType的类型都是值类型,而其他类型都是引用类型。常用的值类型包括结构、枚举、整数型、浮点型、布尔型等,而在C#中所有以class关键字定义的类型都是引用类型。
回复 使用道具 举报
C#默认的参数传递都是以传值传递过去的,无论是值类型还是引用类型在传值参数的情况下都会构造一个新的副本,对于值类型是重新构造一个值类型变量(其数据都存储在当前这个对象中),而引用类型会重新生成一个引用变量(这个变量只是指向一个托管堆中的对象);
引用传参的情况下不会生成新的变量,在C#中引用传参需要用ref关键字进行修饰,引用传参时实参作为最终传递给函数的参数,而不象值传递那样需要生成实参的副本然后传递给函数;
回复 使用道具 举报
堆和堆栈的区别,值类型是直接定义在堆栈上的,比如int类型,定义一个int实例是不需要new的,而引用类型是在内存堆里开辟空间的,比如一个类,引用一个类的实例是要new的,引用类型在传递参数时实际上是传了一个指针,也就是指向这个类实际内存位置的地址,所以在方法中对类做操作,会直接改变这个类的值,而值类型做参数传到一个方法里操作,是不会影响到原来的值的,多说几句就是:对引用类型的建立和操作所耗费的资源要大大高于值类型,因为访问内存堆要比访问堆栈效率低的多,但由于堆栈的空间很有限,所以只能放值类型进去而不能把所有东西都丢进去
回复 使用道具 举报
值类型:直接在堆栈(stack)中存贮该类型的值,
引用类型:在堆栈中存放指向实际对象的指针,而在托管堆(managed heap)中存放实际对象。
值类型的优点是访问性能好。访问引用类型对象时必须多进行一次内存引用的操作,而且引用类型对象必须分配多余内存存放虚函数指针和线程同步块,对于内存需求较大。引用类型的优点是回收站会自动替你管理分配在托管堆中的内存。
回复 使用道具 举报
值类型是传递只是将这个值得拷贝传给了你,你改变这个值,并不影响原来的数,可引用传递,等于把这个装有这个数的内存空间给你了,你后来的操作,会改变这个内存中的数
回复 使用道具 举报
值类型:
单元直接存放“有效值”
如:
int a=3;
则a内存单元就放的是3

引用类型:
单元放的是另外一个对象的引用(地址)
如:
Form form1=new Form();
就是说,在内存中开辟了一个对象new Form(),form1内存单元存放的是那个对象的地址,并非对象本身
回复 使用道具 举报
值类型是直接定义在堆栈上的,比如我们定义int类型,不需要new,而引用类型则是在内存堆里开辟一块空间,比如类,引用一个类的实例是要new的,引用类型在传递参数时实际上传的是指针,也就是指向这个类实际内存位置的地址,所以在方法中对类做操作,会改变这个类的值,而值类型则不会影响到原来的值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马