比如一个类中实例化的一个
int[] x=new int[2]{1,2};
里面的每个整型数都存在堆栈中还是堆中?? 如果在堆中可以存储值类型变量,那装箱就不需要在栈中创建值类型变量了啊
int[] x=new int[2]{1,2};
里面的每个整型数都存在堆栈中还是堆中?? 如果在堆中可以存储值类型变量,那装箱就不需要在栈中创建值类型变量了啊
解决方案 »
- 下载文件时的问题
- ●关于DataTable 的 Select 方法●
- 急急急,救命啊,哪位师傅,帮我看下!小弟先谢了!关于文件读写的问题
- DataGrid隶属关系的显示 呕也 ~~~
- 這樣刷新頁面怎麼總是不行????
- 华为 SubmitAExEx api在C#的声明
- 请问怎样用C#开发Serv-U的插件?
- delphi7---> delphi 2005 的问题
- 自己在c#里面如何做特殊形状的按扭,要用哪些控件???
- 『简单问题』比较两个日期的大小
- 100分求解webservice中的实体类在客户端做参数传递解决方法
- 疯了,求_17499_RTL_X86_CHS_VSTO_HXS.CAB 这个文件
========================================
里面的整数是存在于堆中
一般来说如果值类型为引用类型的一部分,它就内置于堆中,即包含在引用类型的数据中。(C#高级编程)如果在堆中可以存储值类型变量,那装箱就不需要在栈中创建值类型变量了啊
=====================================================================
首先指正下,这句话是不是写反了?是拆箱?
装箱和拆箱是.net中为了实现引用类型和值类型之间转换的产物,因为你这种类型的存储方式不一致,也可以说是瀑布得以而这样做的,好像你理解的方向不对。
这个问题其实可以深究另外,微软使用了一个新的名词字段(Field)来描述我们以前所称呼的成员变量,所以准确的描述是,类型的字段随实例储存,引用类型的字段随实例储存在托管堆上,即使字段的类型是值类型的。
回到楼主的问题,其实楼主说的不无道理,值类型可以存在托管堆上,那么访问他的时候为什么不直接操作托管堆上的数据而要拷贝到堆栈上(拆箱)来修改。猜测是因为值类型的变量(变量与字段不同)的问题,在CLR里面,值类型的变量必须是保存在堆栈上。而实际上不拆箱,直接在托管堆上对值类型进行操作也是可以的,通过反射即可。
其实都是,gc 和 .net 阉割了指针惹的祸