2013-07-31 122 views
3

我正在阅读埃里克的博客系列的静态构造函数和想到的是,作为实例构造函数可以重载,为什么静态构造函数不能被重载? 背后没有提供相同的原因是什么?静态构造函数重载?

+0

Eric的博客maby有任何链接吗? (: – dotixx

+0

谁是埃里克?他的博客链接将帮助我们更好地理解你的问题。 – Renan

+2

参数来自哪里? –

回答

5

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

+0

我知道它不能接受一个参数,但为什么会这样呢,保持这个原因的主要原因是什么,为什么不呢? –

+1

@ user2639248:因为你可以*不*永远直接调用静态构造函数;它是由运行时为你完成的,这就是为什么它可以*不能*取一个参数,请参见[答案](http:// stackover flow.com/a/17978042/45914)。 – jason

16

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

+0

当然,但我们可以想象,可以改变说:手动调用静态构造器?添加和缺点? – Toto

+0

我喜欢你的回答 –

+0

@Toto:不,你不想考虑手动调用静态构造函数的可能性。它是由语言设计的,在需要之前执行*精确*一次*。您*需要*该功能。使它手动,运行时不能再保证。 – jason

2

问“为什么”一种特定的语言特征被设计成这种方式常常导致意见问题,这就是为什么这些类型的问题在堆栈溢出时不鼓励的原因。也就是说,即使这只是一个意见问题,有时候一个答案可以导致更深入的理解。明白,我是而不是在C#开发团队或任何附属于微软,所以你可以采取我的答案一粒盐。

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

用这种方式编写简单的程序很容易,看起来您可以手动进行保证 - 通过使应用程序调用静态构造函数作为它的第一件事情之一。但是它并不需要一个非常复杂的程序来确保在第一次使用类的实例之前调用所有静态构造函数是很困难的。

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

你可能移动的责任主程序,使其调用静态构造函数FooBar之前要求Frob静态构造函数,但随后每类的静态构造函数必须是public,你的代码将除了一些你关心的课程需要它之外,你完全不需要知道静态构造函数的调用。

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

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

所以在我看来,静态构造函数的工作方式是因为这是在语言的整体设计中唯一有道理的方法。

如果你正在寻找的是一个单身......呃,这是另一回事。我建议Jon Skeet的Implementing the Singleton Pattern in C#