【问题标题】:How many instances and references are created for a Base-Sub Class?为基子类创建了多少实例和引用?
【发布时间】:2011-03-22 12:31:28
【问题描述】:

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

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

  1. ClassB b = new ClassB();

  2. ClassA a = new ClassB();

【问题讨论】:

  • 这将是两个实例。每次使用new 等于实例化一个对象。

标签: c# .net constructor instantiation


【解决方案1】:

类比对象是一个气球,而引用是一个绑在气球上的字符串,在以下每种情况下,都会有一个气球和一个字符串:

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

【讨论】:

  • 我的一位同事争辩说,创建 ClassB 的实例将创建 2 个对象(ClassA 和 ClassB),因为调用了两个对象的构造函数。我想知道这是否正确
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • new ClassB() 无论如何都会创建一个新的 ClassB 实例。该实例会发生什么取决于程序。在这种情况下,对实例的引用存储在 ClassA 引用中。但它仍然是ClassB 的一个实例
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2014-09-19
    • 2014-04-27
    • 2014-07-08
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多