为Base-Sub类创建了多少个实例和引用?

时间:2010-07-29 03:46:17

标签: c# .net constructor instantiation

在C#.NET中,我有2个具体的类。 A类和B类.B类是A类的子类。

为每行代码创建了多少个实例(堆上的对象)以及从堆栈到堆对象的引用:

  1. ClassB b = new ClassB();

  2. ClassA a = new ClassB();

3 个答案:

答案 0 :(得分:4)

比喻对象是一个气球而且引用是一个与气球相关的字符串,在下列每种情况下都会有一个balolon和一个字符串:

ClassB b = new ClassB(); //one reference, one heap object
ClassA a = new ClassB(); //one reference, one heap object

因此,同时运行两个对象将创建两个对象和两个引用。

编辑看一下从ClassB构造函数生成的IL:

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

答案 1 :(得分:0)

这实际上取决于每个班级的成员。假设它们是空类,每个对象一个引用,总共两个。也就是说,创建ClassB对象不会创建对其本身的引用。

如果他们有成员,当然,会员还有其他参考资料,但我认为这不是你问题的要点。

答案 2 :(得分:-1)

在第一种情况下 - 你将只有一个B类实例。在第二种情况下,你将有一个B类实例。在第二种情况下不会创建A类实例。