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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu0o0y 中级黑马   /  2014-4-29 08:44  /  1519 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 liu0o0y 于 2014-4-29 17:04 编辑

在C#中什么是值类型,什么是引用类型,值类型和引用类型有什么不同

6 个回复

倒序浏览
值类型:所有数值类型 char bool 枚举 结构
值类型的变量存储在栈空间,这个变量的值 直接存储在栈空间的变量中;
在传递值得时候,同样会将变量里的值拷贝一份 由于变量里存储的是真实的值,所以修改第2个变量的时候 不会影响原来变量的值。

引用类型:string  array class
引用类型的数据的变量存储在栈空间,真实的值(对象)存储在堆空间中, 栈空间的变量里存储的是堆空间里的对象的地址;
变量声明在栈里面,真实的对象存储在堆里面,栈里面的变量存储的是对象的地址;
在传递值的时候,会将变量里的值拷贝1份,进行传递,由于变量里面存储的是引用地址,所以传递变量之后, 第2个变量里面存储的也是这个地址,但是这个地址指向的对象和原来的变量指向的是同1个对象,所以对 第2个变量进行修改会影响到原来的变量的值。

评分

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

查看全部评分

回复 使用道具 举报
1. 将一个值类型变量赋值给另一个值类型变量时候,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身;
2. 值类型不可能派生出新的类型,所有的值类型均隐士派生自Systen.ValueType。但是与引用类型相同的是,结构也可以实现接口;
3.值类型不可能包含null值,然而,可空类型功能允许将null赋给值类型;
4.每种值类型均有一个隐士的默认构造函数来初始化该类型的默认值。
回复 使用道具 举报
另外稍微提一下。值类型放在栈上什么的,也不是最正确的表述。
值类型存放在“声明它的空间上”。
也就是说,如果是在函数内部声明的局部变量,值类型会放到栈上。如果作为对象的字段,值类型似乎也会放在堆上。
而且,函数内部声明的局部变量,也不一定就会放在栈上。因为还有委托的闭包等等情况……

仅仅是个人理解,误导了的话勿怪……

评分

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

查看全部评分

回复 使用道具 举报
            简单的说,值类型如:int,bool都是对值拷贝,不会影响它本身,如果将两个int类型的数据复制需要个中间变量.就比方说在函数传参数若是值类型的,那它不会受影响其值。
            而引用类型就不一样了,它是地址的改变,若作为参数传入引用类型的变量,在外部打印出,它的值会受到改变。
          个人见解,其实,你在程序中试下就行了
回复 使用道具 举报
当有人给你回复后,请把帖子编辑为提问结束。这样版主才给你加技术分。。
回复 使用道具 举报
值类型和引用类型最好结合内存中堆栈的示意图来理解会更深刻,值类型就是在栈空间中开辟控件存储值,拷贝复制等是吧整个值拷贝,引用类型是在栈控件存储堆空间的地址,而真正开辟的控件是在堆中,拷贝复制栈控件的变量只是复制了堆空间的地址,这样理解是最深刻的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马