В С# .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 создан не будет.
new ClassB() создает новый экземпляр ClassB независимо. Что происходит с этим экземпляром, зависит от программы. В этом случае ссылка на экземпляр сохраняется в ссылке ClassA. Но это все еще экземпляр ClassB
- person Matt Greer; 29.07.2010
newравно еще одному созданному объекту. - person Matt Greer   schedule 29.07.2010