Дублируются ли методы экземпляра в памяти для каждого объекта?

чтобы быть более ясным в моем вопросе, если вы создаете массив определенного класса: например,

ExampleClass[] test = new ExampleClass[5]; 

Я знаю пять ExampleClass экземпляры создадут копию каждой переменной для каждого класса, но будут ли методы/функции дублироваться 5 раз в памяти или каждый из тестов просто указывает на одну и ту же кодовую базу класса? Если он дублируется для каждого класса, это было бы просто пустой тратой памяти.

1 ответов


каждый тип, загруженный в AppDomain, будет иметь Таблица Метод структура, которая содержит каждый метод, который определяет тип, плюс виртуальные методы, производные от parent (обычно объект) и методы, определенные любым реализованным интерфейсом.

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

например:

 public class MyClass : IDisposable
 {
        private static void MyStaticMethod()
        {
            // ....
        }
        public void MyInstanceMethod()
        {
            // ....
        }
        public void Dispose()
        {
            throw new NotImplementedException();
        }
 }

этот MyClass будет иметь таблицу методов, включая:

  • MyStaticMethod
  • MyInstanceMethod
  • Dispose
  • и другие виртуальные методы производного от System.Объект

посмотрите на хорошую диаграмму таблицы методов:

Method Table Diagram

вы можете проверить всю статью о таблицах метод здесь