我对类和对象有一些小疑问。
在课堂上,我有10到20种方法,(下面分享)
public class tstCls
{
public void a1()
{ }
void a2()
{ }
void a3()
{ }
void a4()
{ }
void a5()
{ }
void a6()
{ }
void a7()
{ }
void a8()
{ }
void a9()
{ }
}
为上述类创建对象时。内存中会存储多少种方法?只有调用方法或所有方法。
static void Main(string[] args)
{
tstCls objcls = new tstCls();
objcls.a1();
}
请你帮我解决上述情况。
答案 0 :(得分:5)
无。
实例化对象时,方法不在内存中创建,只有字段和属性。
只要引用程序集的任何部分,就会加载包含这些方法的程序集。
方法只有在调用时才会被编译到内存中。 JIT(Just-In-Time编译器)在那个时刻将方法从IL转换为机器代码。
答案 1 :(得分:1)
对于实例,只会创建一个方法。
您可以参考此artilce:Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects
每个类和接口在加载到AppDomain时都是 由MethodTable数据结构在内存中表示。这是一个 第一个实例之前的类加载活动的结果 对象永远创建。 ObjectInstance表示状态, MethodTable表示行为。 MethodTable绑定对象 实例到语言编译器生成的内存映射元数据 结构通过EEClass。 MethodTable中的信息和 挂起它的数据结构可以从托管代码访问 通过System.Type。甚至可以获取指向MethodTable的指针 在托管代码中通过Type.RuntimeTypeHandle属性。 TypeHandle包含在ObjectInstance中,指向一个 从MethodTable的开头偏移。该偏移量为12个字节 默认情况下,包含我们不会在此讨论的GC信息。
答案 2 :(得分:0)
将在内存中存储多少种方法
全部。所有方法都将存储在内存中 更重要的是,无论实例数量多少,它们都将被创建一次。
所以,这句话并不准确:“为上面的类创建了一个对象......”。
每个程序集类型在内存中创建一个方法 - 不为每个实例创建/复制方法
因此,在程序集加载期间,将创建所有方法并将其存储在内存中,然后只为a1
实例调用objcls
。