Сколько экземпляров и ссылок создано для класса Base-Sub? - PullRequest
2 голосов
/ 29 июля 2010

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

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

  1. ClassB b = new ClassB();

  2. ClassA a = new ClassB();

Ответы [ 3 ]

4 голосов
/ 29 июля 2010

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

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

0 голосов
/ 29 июля 2010

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

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

0 голосов
/ 29 июля 2010

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

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