【发布时间】:2020-06-10 10:19:26
【问题描述】:
我有一个基本查询。我有一个空的派生类。我注意到,当我运行下面粘贴的一段代码(在 Linqpad 中运行)时,我最终得到了 4 个 BASE 类的对象。我的理解是,当我们实例化一个派生类对象时,在没有它自己的构造函数的情况下,会调用 BASE Class 构造函数,从而产生一个派生类的实例。
void Main()
{
NestedS n1 = new NestedS();
NestedS n2 = new NestedS();
NestedS n3 = new NestedS();
}
public class Base1
{
private static readonly Base1 instance = new Base1();
private static int numInstance = 0;
private readonly object lock1 = new object();
public Base1()
{
lock(lock1)
{
numInstance.Dump("before");
numInstance++;
numInstance.Dump("here");
}
}
}
public class NestedS : Base1{
}
代码生成了 4 个派生类实例。有人可以向我解释一下背后的原因吗?
更新: 对不起,在这里改写我的查询,也粘贴输出。从输出来看,numInstance 应该在创建第二个实例之前已经初始化为 1,但在创建第二个实例时它仍然是 0:
before
0
here
1
before
0
here
1
before
1
here
2
before
2
here
3 ```
【问题讨论】:
-
您创建了 4 个对象:
instance、n1、n2和n3- 那么您为什么希望只有 1 个对象? -
"如果没有自己的构造函数,将调用基类构造函数" - 每个派生类总是必须调用其基类的构造函数以确保它具有被正确构建。派生类是否提供用户定义的构造函数并不重要
-
尝试在
private static readonly Base1 instance = new Base1();之前移动private static int numInstance = 0;- 这似乎可以解决问题,尽管我不确定原因(以及语言标准对此有何规定) -
注意:调用基本构造函数不是创建另一个对象 - 派生类型的实例是(单个)对象
-
谢谢,错字抱歉。后面提到了派生类实例。但是我很困惑为什么在创建基类的第一个对象后连续调用创建派生类实例时 numInstance 没有更改为 1。 (实例)。