具有公共无参数构造函数的Object类的好处是什么?

时间:2012-11-01 05:13:50

标签: c# object abstract-class default-constructor

我一直在努力确定为什么Object类具有公共的无参数构造函数,或者确实为什么它没有标记为abstract

我无法看到有必要(明确地)调用Object的公共构造函数的合理情况;我们只对派生类型的构造函数感兴趣。

我理解需要在Object中提供默认构造函数,以便为每个其他Type提供一个可以隐式或显式调用的默认构造函数。当然,这个默认构造函数只需要标记为protected,不是吗?

我见过人们在线程同步中构造'空对象';但在这种情况下锁定“真实对象”是不是更正确?

同样,由于Object类公开的功能仅对派生类型(或静态调用)有用,为什么它不是一个抽象类?这似乎是一个更好的设计,而不是有一个类,它给程序员一个印象,它可以自己有意义地实例化。

我怀疑答案可能与CLR的内部工作有关,但我想知道为什么Object需要一个公共构造函数,如果有任何理由它为什么不能不要标记为abstract

2 个答案:

答案 0 :(得分:2)

这确实可能与线程同步有关。见http://msdn.microsoft.com/en-us/library/ms173179.aspx

Microsoft使用

的事实
private System.Object lockThis = new System.Object();

在他们自己的例子中告诉我,在他们看来,仅仅为了同步而制作一个新对象是完全正确的。

此外,Java允许在他们的同步示例中使用完全相同的东西,因此Microsoft的开发人员可能只是“跟风”,似乎是使语言行为的标准方法。

当然,CLR中也可能有一些秘密的技术原因。

答案 1 :(得分:0)

我可以想到为什么Object不应该被抽象,以及它的默认构造函数用于CLR内部功能的一个原因是装箱和拆箱时。

检查http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

此外,线程同步不必使用'真实'对象,因为使用对象的目的是获取锁(一旦线程获得锁,其他人将不得不等到它被释放),而不是锁定对象本身。

为了参数,如果线程对它的工作没有真正的对象的兴趣(可能是它做了一些整数操作),那么它应该使用用默认构造函数创建的空对象。