我一直在努力确定为什么Object
类具有公共的无参数构造函数,或者确实为什么它没有标记为abstract
。
我无法看到有必要(明确地)调用Object
的公共构造函数的合理情况;我们只对派生类型的构造函数感兴趣。
我理解需要在Object
中提供默认构造函数,以便为每个其他Type
提供一个可以隐式或显式调用的默认构造函数。当然,这个默认构造函数只需要标记为protected
,不是吗?
我见过人们在线程同步中构造'空对象';但在这种情况下锁定“真实对象”是不是更正确?
同样,由于Object
类公开的功能仅对派生类型(或静态调用)有用,为什么它不是一个抽象类?这似乎是一个更好的设计,而不是有一个类,它给程序员一个印象,它可以自己有意义地实例化。
我怀疑答案可能与CLR的内部工作有关,但我想知道为什么Object
需要一个公共构造函数,如果有任何理由它为什么不能不要标记为abstract
。
答案 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
此外,线程同步不必使用'真实'对象,因为使用对象的目的是获取锁(一旦线程获得锁,其他人将不得不等到它被释放),而不是锁定对象本身。
为了参数,如果线程对它的工作没有真正的对象的兴趣(可能是它做了一些整数操作),那么它应该使用用默认构造函数创建的空对象。