【问题标题】:What Are the Benefits of the Object class having a public parameterless constructor?具有公共无参数构造函数的 Object 类有什么好处?
【发布时间】:2012-10-21 16:49:30
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您不能将构造函数标记为抽象,尽管您可能打算将类标记为抽象
  • @RuneFS 是的,我就是这个意思。作为使构造函数受保护的替代方法,使类抽象会产生相同的结果。

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


【解决方案1】:

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

微软使用的事实

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

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

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

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

【讨论】:

  • 来自同一篇 MSDN 文章:“然而,在实践中,这个对象通常代表需要线程同步的资源。”这向我表明new object()主要用于示例代码,而不是实际场景的推荐实践。
  • 事实并非如此。通常建议使用private object _locker = new object() 而不是使用对象本身(或this),因为任何数量的未协调线程都可能访问this,而_locker 的使用更有可能明确地用作同步协作线程之间的机制。
  • 鉴于到目前为止关于该主题的内容,我很高兴将其标记为已接受的答案。如果这个单一的目的是Object 可以被实例化的原因,这似乎是一个糟糕的设计决策。如果有一个专门用于线程同步的类,听起来Object 可能会变得抽象(或将其公共构造函数拿走)。
【解决方案2】:

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

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

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

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

【讨论】:

  • 当一个值类型被装箱时,CLR 不会创建一个更专业的类的实例,例如System.Int32System.DateTime?如果是这样,它将调用相关类型的派生构造函数。
  • 我指的是问题中提到的“真实对象”,我相信它指的是您使用自己的属性和方法定义的自定义类,而不是框架提供的对象
  • @BradleySmith,不,我不这么认为,因为 Int32 派生自 System.ValueType,创建一个实例会破坏装箱的目的,实际上,当您使用 int 时,它使用 System.ValueType。 Int32 类。
  • 我的印象是编译器将值类型的变量转换为等效 CLR 类型的变量,因此在值被创建之前不会创建实际 ValueType 'class' 的实例盒装。
  • CLR 中的所有内容都继承自 system.object;没有其他变量。 Int、float 等是编译器快捷方式,它们在幕后为您创建相应的值类型结构
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多