Сколько методов в классе будет создано в памяти при создании объекта в 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, которую мы не будем обсуждать здесь.
сколько методов будет храниться в памяти
все. Все методы будут сохранены в памяти.
Что более важно, все они будут созданы один раз, независимо от количества экземпляров.
таким образом, это утверждение не является точным: "при создании объекта для вышеуказанного класса...".
каждый тип сборки создает один метод в памяти-методы не создаются / копируются для каждого экземпляра.
Итак, во время сборки загрузите все методы будет создан и сохранен в памяти, а затем только a1
будет называться objcls
экземпляра.