【问题标题】:Static constructor overloading?静态构造函数重载?
【发布时间】:2013-08-01 10:18:09
【问题描述】:

我正在阅读 Eric 的关于静态构造函数的博客系列,并想到既然实例构造函数可以被重载,为什么静态构造函数不能被重载? 这不提供相同的原因是什么?

【问题讨论】:

  • Eric 的博客有链接吗? (:
  • 埃里克是谁?指向他的博客的链接将有助于我们更好地理解您的问题。
  • 论据从何而来?
  • @dotixx:使用ericlippert.com/2013/02/06/static-constructors-part-one 并点击其中的链接获取剩余的三个部分(总共四个部分)。
  • @renan 我敢打赌,如果你在你最喜欢的搜索引擎中输入 Eric c# static constructor blog 你会找到它。

标签: c# .net


【解决方案1】:

因为你可以永远直接调用静态构造函数;它总是由运行时为您隐式完成。因此,您不能将参数传递给静态构造函数;因此,唯一可能的静态构造函数是带有默认参数的构造函数。

【讨论】:

  • 当然可以,但我们可以想象可以改变说:静态构造函数被手动调用吗?加和缺点?
  • @Toto:不,您不想考虑手动调用静态构造函数的可能性。它被语言设计为准确执行一次before。您需要该功能。让它手动,运行时不能再保证了。
  • 这是目前的语言设计,但为什么是这样的设计?为什么不只运行第一个 construcot 并在后面的那些上播放忽略/抛出异常?
  • @Toto:好吧,让我们看看。成本:实施成本(包括机会成本)、严重错误的来源。好处:可以将参数传递给静态构造函数。没有超过我的门槛。如果您需要为静态成员设置状态,请在 static 构造函数运行后传递它们(由于它现在的实现方式,您保证它在您尝试之前已经运行设置状态)。
  • @Jason : 事实上我真的更喜欢当前的行为!
【解决方案2】:

静态构造函数不能带参数。这意味着您不能创建一个不同的方法签名来防止过载。

【讨论】:

  • 我知道它不能带参数,但为什么会这样,保持这样的主要原因是什么,为什么不呢?
  • @user2639248:因为您不能直接调用静态构造函数;它由运行时为您完成。这就是为什么它不能接受一个参数。请看这个answer
【解决方案3】:

询问“为什么”以这种方式设计特定语言功能通常会导致意见问题,这就是 Stack Overflow 不鼓励此类问题的原因。也就是说,有时一个答案,即使只是一个意见问题,也可以导致更深入的理解。请理解,我不是 C# 开发团队的成员,也不以任何方式隶属于 Microsoft,因此您可以对我的回答持保留态度。

静态构造函数的工作是初始化类运行所需的任何静态数据。 C# 的设计使得静态构造函数保证在创建类的任何实例之前、调用任何静态方法或访问静态属性之前执行。

编写简单的程序很容易,看起来您可以手动做出保证——通过让应用程序调用静态构造函数作为它首先要做的事情之一。但它不需要非常复杂的程序来确保在第一次使用类的实例之前调用所有静态构造函数。

例如,假设您包含一个名为Foo 的第三方组件,该组件具有静态构造函数。为了使用它,您的应用程序必须在执行任何其他操作之前调用Foo 静态构造函数。并且必须编写 Foo 构造函数,以便它为它使用的每个类调用静态构造函数。如果Foo 静态构造函数和Bar 静态构造函数都必须确保调用Frob 静态构造函数会发生什么?在您的场景中,调用它的第二个肯定会引发异常。

您可能会将该责任转移到主程序,以便它在调用FooBar 的静态构造函数之前调用Frob 的静态构造函数,但是每个类的静态构造函数都必须是@987654332 @,并且您的代码将充满对静态构造函数的调用,这些调用除了您关心的某个类需要它之外,您完全一无所知。

这听起来对我来说不是一个非常友好的设计。

如果您的静态构造函数需要一个参数,将该参数放入应用程序配置文件或从命令行获取。我强烈建议不要创建一个单独的 Initialize 方法来手动调用,主要是因为很难确保在需要时调用这样的东西。请参阅Be careful with static classes 了解更多信息,包括一些信息链接。

因此,在我看来,静态构造函数以它们的方式工作的原因是,考虑到语言的整体设计,这是唯一有意义的方式。

如果您要寻找的是单例……那么,那是另一回事了。我建议 Jon Skeet 的 Implementing the Singleton Pattern in C#

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2010-09-12
    • 2011-10-07
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多