3

一段时间以来,我一直在尝试确定为什么Object该类有一个公共的、无参数的构造函数,或者实际上,为什么它没有被标记abstract

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

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

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

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

我怀疑答案可能与 CLR 的内部工作有关,但我想知道为什么有必要Object拥有一个公共构造函数,以及是否有任何原因不能标记它abstract

4

2 回答 2

2

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

微软使用的事实

private System.Object lockThis = new System.Object();

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

此外,Java 在他们的同步示例中允许完全相同的东西,因此微软的开发人员可能只是“效仿”了看起来像是让语言表现的标准方式。

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

于 2012-11-01T05:27:59.730 回答
0

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

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

此外,线程同步不必使用“真实”对象,因为使用对象的目的是获取锁(一旦线程获取锁,其他所有人都必须等待它释放),而不是锁定对象本身。

为了论证,如果线程对真实对象不感兴趣(可能是它在做一些整数操作),那么它应该使用一个用默认构造函数创建的空对象。

于 2012-11-01T05:30:58.403 回答