Сколько методов в классе будет создано в памяти при создании объекта в C#? [дубликат]

этот вопрос уже есть ответ здесь:

у меня есть небольшие сомнения с классами и объектами.

в классе у меня есть от 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 ответов


нет.

методы не создано в памяти при создании экземпляра объекта используются только поля и свойства.

сборка, содержащая методы, загружается при каждой ссылке на какую-либо часть сборки.

методы компилируются в память только при их вызове. JIT (Just-In-Time compiler) превращает методы из IL в машинный код в этот момент времени.


для экземпляра будет создан только один метод.

вы можете обратиться к этой artilce:детализация в .NET Framework Internals, чтобы увидеть, как среда CLR создает объекты среды выполнения

каждый класс и интерфейс, при загрузке в AppDomain, будет представлено в памяти структурой данных MethodTable. Это результат действия загрузки класса перед первым экземпляром объект всегда создается. В то время как ObjectInstance представляет государство, MethodTable представляет поведение. MethodTable связывает объект экземпляр с компилятором языка памяти метаданных структуры через EEClass. Информация в MethodTable и зависающие структуры данных можно получить из управляемого кода через систему.Тип. Указатель на MethodTable можно получить даже в управляемом коде через Тип.Собственность RuntimeTypeHandle. TypeHandle, который содержится в ObjectInstance, указывает на сдвиг с начала MethodTable. Это смещение составляет 12 байт по умолчанию и содержит информацию GC, которую мы не будем обсуждать здесь.

enter image description here


сколько методов будет храниться в памяти

все. Все методы будут сохранены в памяти.
Что более важно, все они будут созданы один раз, независимо от количества экземпляров.

таким образом, это утверждение не является точным: "при создании объекта для вышеуказанного класса...".

каждый тип сборки создает один метод в памяти-методы не создаются / копируются для каждого экземпляра.
Итак, во время сборки загрузите все методы будет создан и сохранен в памяти, а затем только a1 будет называться objcls экземпляра.