C# Net中的私有构造函数与静态构造函数

C# Net中的私有构造函数与静态构造函数,c#,.net,static-constructor,private-constructor,C#,.net,Static Constructor,Private Constructor,我搜索了很多,但没有一个答案是清楚的(至少对我来说是这样!)。现在我提出这个问题,因为我相信我在其他任何地方都找不到更明确的答案 我什么时候应该在类中使用私有/静态构造函数 我厌倦了通常的答案,所以请帮我介绍一些使用这些构造函数的实时示例和优缺点。静态构造函数:用于初始化静态成员 私有构造函数:当您只想从类自身的代码中实例化类(通常在静态方法中)时使用。例如: public class Thing { static int Number; static Thing()

我搜索了很多,但没有一个答案是清楚的(至少对我来说是这样!)。现在我提出这个问题,因为我相信我在其他任何地方都找不到更明确的答案

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


我厌倦了通常的答案,所以请帮我介绍一些使用这些构造函数的实时示例和优缺点。

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

私有构造函数:当您只想从类自身的代码中实例化类(通常在静态方法中)时使用。例如:

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()
    {
    }
}

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

如果您有构造函数的重载,则使用私有构造函数,其中一些构造函数应仅由其他构造函数使用

我什么时候应该在类中使用私有构造函数

当你想要一个构造器,但又不想把它公开给全世界时。这可能是因为您有一个调用构造函数的工厂方法(在验证之后),或者是因为该构造函数是由ctor链接调用的(即
public Foo(string):This(){…}

此外,请注意,反射代码通常能够使用私有构造函数,例如序列化或ORM库

此外,在早期的C#编译器中,当您编写现在的
静态类时,拥有私有构造函数是使其看起来不可创建的唯一方法

我什么时候应该在类中使用静态构造函数


当您需要在实例或静态方法访问某个静态状态之前初始化该状态时。

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