Сколько экземпляров и ссылок создается для базового подкласса?

В С# .NET у меня есть 2 конкретных класса. Класс A и B. Класс B является подклассом класса A.

Сколько экземпляров (объектов в куче) и ссылок из стека на объекты кучи создается для каждой строки кода:

  1. ClassB b = new ClassB();

  2. ClassA a = new ClassB();


person rro    schedule 29.07.2010    source источник
comment
Это будет два экземпляра. Каждое использование new равно еще одному созданному объекту.   -  person Matt Greer    schedule 29.07.2010


Ответы (3)


Продолжая аналогию с тем, что объект — это воздушный шар, а ссылка — это веревка, привязанная к воздушному шару, в каждом из следующих случаев будет один шарик и одна веревка:

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++.

person Igor Zevaka    schedule 29.07.2010
comment
Мой коллега утверждал, что создание экземпляра ClassB создаст 2 объекта (ClassA и ClassB), потому что были вызваны конструкторы обоих объектов. Я хочу знать, правильно ли это - person rro; 29.07.2010

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

Если у них есть члены, конечно, есть дополнительные ссылки на членов, но я думаю, что суть вашего вопроса не в этом.

person kbrimington    schedule 29.07.2010

В первом случае - у вас будет только один экземпляр класса B. Во втором случае у вас будет один экземпляр класса B. Во втором случае экземпляр класса A создан не будет.

person matrix    schedule 29.07.2010
comment
new ClassB() создает новый экземпляр ClassB независимо. Что происходит с этим экземпляром, зависит от программы. В этом случае ссылка на экземпляр сохраняется в ссылке ClassA. Но это все еще экземпляр ClassB - person Matt Greer; 29.07.2010