В С# .NET у меня есть 2 конкретных класса. Класс A и B. Класс B является подклассом класса A.
Сколько экземпляров (объектов в куче) и ссылок из стека на объекты кучи создается для каждой строки кода:
ClassB b = new ClassB();ClassA a = new ClassB();
Вопрос
В С# .NET у меня есть 2 конкретных класса. Класс A и B. Класс B является подклассом класса A.
Сколько экземпляров (объектов в куче) и ссылок из стека на объекты кучи создается для каждой строки кода:
ClassB b = new ClassB();
ClassA a = new ClassB();
Продолжая аналогию с тем, что объект - это воздушный шар, а ссылка - это веревка, привязанная к воздушному шару, в каждом из следующих случаев будет один шарик и одна веревка:
ClassB b = new ClassB(); //one reference, one heap object
ClassA a = new ClassB(); //one reference, one heap object
Запуск обоих одновременно создаст два объекта и две ссылки.
ИЗМЕНИТЬ Посмотрите на этот IL, сгенерированный из конструктора ClassB:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void InheritanceTest.ClassA::.ctor()
IL_0006: ret
} // end of method ClassB::.ctor
call instance void InheritanceTest.ClassA::.ctor() указывает, что он вызывает конструктор ClassA как функцию-член (а не как функцию объекта-члена). Это соответствует моему пониманию того, что происходит с экземплярами унаследованных классов, что производный класс - это просто все члены базового класса, за которыми следуют его собственные члены, аналогично C++.
Это действительно зависит от того, какие члены находятся в каждом классе. Предположим, что это пустые классы, по одной ссылке на объект, всего два. То есть создание объекта ClassB не создает ссылок ни на что другое, кроме самого себя.
Если у них есть члены, конечно, есть дополнительные ссылки на членов, но я думаю, что суть вашего вопроса не в этом.
В первом случае - у вас будет только один экземпляр класса B. Во втором случае у вас будет один экземпляр класса B. Во втором случае экземпляр класса A создан не будет.
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.