在C#中创建对象时,将在内存中创建多少个方法?

时间:2016-08-12 05:41:58

标签: c# .net oop

我对类和对象有一些小疑问。

在课堂上,我有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();
    }

请你帮我解决上述情况。

3 个答案:

答案 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信息。

enter image description here

答案 2 :(得分:0)

  

将在内存中存储多少种方法

全部。所有方法都将存储在内存中 更重要的是,无论实例数量多少,它们都将被创建一次。

所以,这句话并不准确:“为上面的类创建了一个对象......”。

每个程序集类型在内存中创建一个方法 - 不为每个实例创建/复制方法 因此,在程序集加载期间,将创建所有方法并将其存储在内存中,然后只为a1实例调用objcls