c#值类型和引用类型存储方式求解

来源:百度知道 编辑:UC知道 时间:2024/05/27 05:41:38
c#引用类型和值类型内存模型求解

(最好能把我问题的问题都回答下,谢谢)

对于值类型存储 在栈中,引用类型存储在堆中我是理解的,但当一个类中的成员字段本身也是引用类型时,数据是怎样存储我我搞不清楚了。还有,对于一个结构体中,成员字段是怎样存储也搞不清楚。例如:

情况一:
class A{}
class B
{
private A a;//问题1::对于这个字段到底是存储在堆中还是栈中???????
public void Test(){}//问题2::对于这个成员方法是怎么存储的呢???
}

情况二:

struct JGT
{
A a;//问题3::A是前面定义的类,照理说结构体是值类型,应该存储在栈中,但是它这个成员字段是引用类型,应该存储在哪呢???
}

问题四::对于一般定义的函数或者类或者结构体中的成员方法在内存中是怎么存储的??
问题五::对于类中的静态变量或者静态方法,存储的方式是怎样的??

情况一中.的A也是存储在堆上的.

栈上指向堆上B的指针->B(这个在堆上),然后B中有个指针指向堆中A所在的地址.

如图示..

情况二中.JGT被分配在栈上.同样内部有个指向堆中A所在内存的指针.

问题四和问题五.同样是分配在堆中,而且据说是和对象分开存储的,是一块特有的空间(没有证实).在存储空间的内部保存了函数的入口地址.调用时通过入口地址去查找函数,静态方法或者静态变量

这个确实是个复杂的问题

我认为A a只是指针,通过new A()才会有实际的存储

静态方法在第一次使用时被创建到内存