Выделение памяти для класса с глубоким наследованием в .NET - PullRequest
5 голосов
/ 04 марта 2010

Если у меня есть классы A, B, C, D, E, интерфейсы типа X, Y, Z и модель системы типа:

class B : A, X
class C : B, Y
class D : C, Z
class E : D

Если A - абстрактный базовый класс, а E - интересующий класс, когда я создаю экземпляр E, он, в свою очередь, создает экземпляры A, B, C, D, X, Y, Z в дополнение к E?

Если это так, это приведет к огромным потерям производительности? Не память, а время выполнения и GC.

Ответы [ 3 ]

7 голосов
/ 04 марта 2010

Это создаст один объект - экземпляр E - но это будет включать все поля, объявленные в иерархии классов. (Интерфейсы не могут объявлять поля, поэтому они не имеют отношения к данным внутри самого объекта.) Только поля (и любые атрибуты, влияющие на макет, по общему признанию), вносят вклад в память, занимаемую объектом.

Ссылка на экземпляр E может быть "преобразована" в ссылку типа A, B, C, D, X, Y или Z в качестве сохраняющего идентичность эталонного преобразования - т.е. она все равно будет ссылкой на тот же объект.

7 голосов
/ 04 марта 2010

Да, это создаст «встроенные» экземпляры A, B, C и D
Нет, он не будет создавать экземпляры X, Y и Z (потому что они являются интерфейсами)

Нет дополнительных затрат на выделение памяти или GC (из ABCD), потому что экземпляр E выделяется как 1 блок. Любые накладные расходы полностью зависят от участвующих конструкторов.

Всегда будет выполняться цепочка конструкторов (от E до A), возможно, конструктор по умолчанию, но также возможно вызвать несколько конструкторов на 1 уровне.

2 голосов
/ 04 марта 2010

Наследование расширяет тип и не создает экземпляры.У вас есть один единственный экземпляр E, который включает в себя данные, определенные A, B, C, D и E. Он предоставляет методы и методы доступа к свойствам, определенные этими классами и интерфейсами X, Y и Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...