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