在 .Net 中,私有构造函数与静态构造函数的区别

10

我对此进行了很多搜索,但是没有一个回答清晰明了(至少对我来说是这样!)。现在我将这个问题发布到SO上,因为我相信我无法在其他地方得到更明确的答案。

在我的类中什么时候应该使用私有/静态构造函数?

我厌倦了常规的答案,请给我一些实时示例以及使用这些构造函数的优点/缺点。


4
私有构造函数 - 如果您不希望对象能够从当前类外部进行构造。静态构造函数 - 如果您需要初始化静态类的状态。 - zerkms
3个回答

17

静态构造函数:用于初始化静态成员。

私有构造函数:仅在希望类只能从其自身代码(通常在静态方法中)实例化时使用。例如:

public class Thing
{
    static int Number;

    static Thing()
    {
        Number = 42; // This will only be called once, no matter how many instances of the class are created
    }

    // This method is the only means for external code to get a new Thing
    public static Thing GetNewThing()
    {
        return new Thing();
    }

    // This constructor can only be called from within the class.
    private Thing()
    {
    }
}

4
你可以这样实现工厂模式——即,如果你有需要处于特定“状态”的业务对象,但又希望防止第三方/其他开发人员使用公共构造函数对其进行初始化,可以将构造函数设为私有,并提供一组工厂方法来创建/获取该对象。这样,他们就无法通过构造函数获得“空白”的无状态对象(除非他们真的想要使用反射)。 - Charleh
1
静态构造函数也可以用于调用私有构造函数,进而实例化包含类类型的私有静态成员。然后静态函数/属性可以返回此成员,因此始终只有一个这样的对象实例 - 单例。 - jwaliszko

8
什么情况下应该在类中使用私有构造函数?
当你想要一个构造函数,但不想让它暴露给外部。这可能是因为你有一个工厂方法调用构造函数(在验证后),或者因为那个构造函数被 ctor-chaining 调用(即 public Foo(string) : this() { ...})。
此外,请注意,反射代码通常能够使用私有构造函数 - 例如序列化或 ORM 库。
另外,在早期的 C# 编译器中,当您编写现在将是静态类的内容时,拥有私有构造函数是使其看起来无法创建的唯一方法。
什么情况下应该在类中使用静态构造函数?
当您需要在实例或静态方法访问该状态之前初始化一些静态状态时。

3

静态构造函数用于初始化类的静态成员,当类的第一个实例被创建或首次访问静态成员时调用。

私有构造函数用于如果你有构造函数的重载,并且其中一些只应该被其他构造函数使用。


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