何时以及为什么应该将静态构造函数设为私有?

3

我知道静态构造函数和私有构造函数的区别以及何时使用它们。但是,什么情况下应该将静态构造函数设置为私有,并且这样做的优点是什么?


@TimSchmelter 除了 IL 之外,还有哪些编程语言可以让你不将其设为私有? - Jonathan Allen
1
没有其他编程语言(在.NET中)允许您不将它们设置为私有。这个规则是由编译器强制执行的,每个.NET框架语言都依赖于它。此外,我想不出任何一个理由需要将其公开。如果您需要能够再次运行其初始化逻辑,请使用一个名为Initialize的静态方法,该静态构造函数调用它。用户可以重新调用Initialize方法。 - Ryan Mann
3个回答

2
在C#中,静态构造函数不允许使用访问修饰符。它们(在某种程度上)始终是公共的,这意味着框架始终可以访问它们以执行特定于类型的初始化。添加publicprivate到静态构造函数将无法通过编译。
一个private构造函数始终是实例私有构造函数,这是一种不同的东西,通常用于创建单例,以防止用户代码通过显式实例化类来创建对象。

1
请注意,从客户端代码的角度来看,它们既不是公共的也不是私有的。您永远无法自己调用静态构造函数,因此在这种情况下,公共与私有并不相关。此外,您实际上无法控制CLR何时决定调用它(这应该始终发生在您尝试自行实例化它或访问该类的任何静态成员之前)。 - vgru

1

静态构造函数应该始终是私有的。

为什么?

通常情况下,静态构造函数在创建该类的第一个实例之前就被框架调用。这将创建一个可供使用的类型的单个实例。

但是,如果构造函数不是私有的,则意味着其他对象也可以创建该实例。这可能会导致意外行为。

因此,静态构造函数应该始终是私有的。


1
我不确定你所说的“如果构造函数不是私有的,那么其他对象也可以创建实例”的意思。你是在谈论静态构造函数还是实例构造函数?如果你是在谈论实例构造函数,我不明白将其设置为公共的会导致意外行为。而静态构造函数不能被其他对象调用,所以我也不理解。 - vgru
我指的是静态构造函数。对于不清楚之处,我表示歉意。 - Amogh Natu
静态构造函数只能是私有的,否则它将无法编译。静态构造函数不会创建实例。 - Rawling

0

private 关键字在 C# 中实际上并没有什么作用。默认情况下,除了无法使用 private 的非嵌套类型之外,其他所有内容都已经是 private 了,因为它们可以是 internal

现在我从不使用 private 关键字,它只是噪音。

注意:这仅适用于 C#。在 Visual Basic 中,默认可见性不合理,您需要在适当的地方明确使用 Private


4
最近我从不使用"private"关键字,但我的行为完全相反 :) 我尽可能地多使用"private"。 - Soner Gönül
1
哦,别误会,我仍然尽可能保持私有。我只是不认为需要关键字本身。这样想:保持私有是免费的,而公开需要输入一些内容。 - Jonathan Allen
1
我使用private关键字是因为它可以提高代码可读性,特别是在有代码审查和QA人员的开发团队中。例如,我的QA人员是一位Java开发人员,正在检查我的C#代码。他不知道C#默认将它们设置为private。因此,我将它们标记为private,这样在视觉上就很好理解了。我坚信尽可能多的信息应该能够通过查看代码来获取。例如,私有方法应该标记为private,并且应该以一种明显的方式命名,以便清楚地了解方法的作用。我也非常注重区域划分。 - Ryan Mann
虽然这是一个有趣的观点,但我不明白它如何回答OP的问题,即“[..]何时应该将静态构造函数设置为私有[..]”。 - default
2
对于那些习惯于使用 VB.NET 的人来说,最好将所有内容都显式声明。否则,你可能会忘记当前项目语言的默认可访问性。 - Tim Schmelter
@Ryios 解决无知的方法不是纵容,而是教育。如果他们连默认为私有这么简单的概念都无法理解,那么他们就不可能理解async/await。 - Jonathan Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接