请教:关于值类型与引用类型

Ivan Zeng 2016-01-29 10:10:05
C#中一切皆对象,而对象为引用类型,那么岂不是所有数据均应存储在堆上?
或者这样说对象中值类型的数据成员是存储在堆上还是存储在栈上?

...全文
216 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
入门书上如果要是说“存储在栈上、存储在堆上”,排除它是人云亦云的抄袭别的书或者msdn上的大段文字那种垃圾做着的“编著”以外,那么这就是指如上那种
int x = 1;
的变量定义和对象(数据)初始化。 如果你偏离了这点,偏要纠结一个明明已经知道“存储在堆上”的对象中的成员是不是值类型的,你觉得这是不是学习学偏了、没理解书上教条的针对性呢?
xuggzu 2016-01-31
  • 打赏
  • 举报
回复
。。。。。。,一切皆对象只是语言对世界的理解,具体到语言里面的定义是分值和引用的; 一切皆对象在C#中的体现,举个例子:int,有int值型和Int32类
  • 打赏
  • 举报
回复
所谓“分配在栈”,是指这样的代码
void test()
{
    var x = new DataType();
    .......
}
假设 DataType 是值类型的,那么 x 就是直接表示栈上一块内存区域,这块区域保存了对象内容。 而假设DataType是引用类型的,那么变量x就是直接表示栈上的一个“引用”数据结构,这个引用的内容不过是间接查找堆上的真实的内存区域的索引。 因此这个所谓的的“分配在栈”是指这样地声明变量 x 的实现机制。而你把它说成是“引用类型对象中的成员是值类型的”,这就偏离了意思。
  • 打赏
  • 举报
回复
引用 楼主 qingfeng_zeng 的回复:
或者这样说对象中值类型的数据成员是存储在堆上还是存储在栈上?
整个对象被引用方式来访问的,你访问“对象中的值类型的数据成员”也是先通过对象引用、然后访问成员。由此可知道它应该保存在哪里。
秋的红果实 2016-01-30
  • 打赏
  • 举报
回复
对象用后的数据由.NET的GC回收,不用程序员管理,而C++是需要程序员自己释放的
秋的红果实 2016-01-30
  • 打赏
  • 举报
回复
C#中一切皆对象? 应该是分2大类, 值类型,老祖宗是ValueType,后代如int,enum,float等基本类型 引用类型,老祖宗是Object,从它继承来的如string,自定义类等类型实例化后,才叫对象 值类型的数据存储在栈上,由操作系统负责回收;引用类型的变量(对象)的数据存储在堆上
  • 打赏
  • 举报
回复
被引用的引用在堆,那么引用本身在哪儿 --> 被引用的在堆,那么引用本身在哪儿
  • 打赏
  • 举报
回复
引用 楼主 qingfeng_zeng 的回复:
C#中一切皆对象,而对象为引用类型,那么岂不是所有数据均应存储在堆上? 或者这样说对象中值类型的数据成员是存储在堆上还是存储在栈上?
就算是按照你说的“对象为引用类型”,被引用的引用在堆,那么引用本身在哪儿?
threenewbee 2016-01-29
  • 打赏
  • 举报
回复
局部变量的值类型,以及局部变量的引用本身(不是引用的对象),在堆栈上。
Poopaye 2016-01-29
  • 打赏
  • 举报
回复
就算知道对象储存在哪里,又有什么用呢?

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧