-3

静态构造函数和私有构造函数有何不同?

public class WorkstationDevicePresenter
{
    private WorkstationDevicePresenter()
    {}
} 

将它们留空有什么意义?

4

4 回答 4

17

将它们留空有什么意义?

制作“空白”构造函数的原因有很多。

您可能会创建一个空白构造函数,因为您希望在调试期间设置断点。

您可能会创建一个空白的静态构造函数,因为这样做会改变静态字段初始值设定项的语义。有关详细信息,请阅读Jon 关于该主题的文章

让我们离开静态构造函数并考虑空白实例构造函数。

激发空白构造函数的关键规则是:默认情况下,如果一个类型中没有构造函数,那么您将免费获得一个“空白”无参数公共构造函数。如果一个类型中有任何构造函数,那么您不会免费获得一个空白的无参数公共构造函数。

所以你想要一个空白构造函数的第一个明显原因是:我想要一个空白的无参数构造函数,但我已经制作了另一个 ctor,所以我不再免费获得一个。

第二个原因是您没有任何 ctor,并且您不想要一个空白的无参数公共构造函数。您可能需要一个空白的无参数私有、内部或受保护构造函数。如果这就是你想要的,那么你必须自己做一个。

特别是,将一个空的私有 ctor 作为唯一的 ctor 意味着无法通过类外部的构造函数实例化该类。如果您想使用工厂模式,这将非常有用。它还防止类外部的代码生成派生类,因为派生类必须能够调用构造函数。如果所有构造函数都是私有的,那么它们就不能派生。

我经常在工厂模式中使用这种变体:

public abstract class Thing
{
  private Thing() {}
  private class RedThing : Thing { ... }
  public static Thing GetRedThing() { return new RedThing(); }
}

看,通过创建一个私有构造函数,我可以创建一个只能由我的代码实例化并且只能由我的代码扩展的公共抽象类,因此我有一个很好的不变量:每次我看到一个类型的对象Thing,我就知道它在哪里来自。

于 2013-03-27T15:12:11.797 回答
2

静态构造函数在类加​​载时发生一次,私有构造函数在被一些通常用于创建单例的公共静态方法或使用 Builder 模式调用时发生。没有理由有一个空白的私有构造函数(我知道)。

于 2013-03-27T14:54:52.227 回答
1

静态构造函数初始化类的静态部分,私有构造函数只能由类本身使用,例如用于创建类的单例对象。

public class MyClass {

    private static int staticitem;
    private int instanceitem;

    static MyClass(){
        staticitem = 0; //define value for staticitem
    }

    private MyClass() { //can only be called from within the class
       instanceitem = 0; //define value for instanceitem
    }

    public static MyClass GetMyClass() {
       MyClass m = new MyClass();
       return m;
    }    

}
于 2013-03-27T14:56:32.810 回答
1

空白的私有构造函数将使类不能被除自身之外的任何东西实例化。如果您没有这段代码,默认情况下编译器会创建一个空白的公共无参数构造函数。

创建静态实例时调用静态构造函数。

例如,您可以使用两者来创建单例模式。

检查以下代码:

public class Singleton
{
    public static Singleton Instance;
    static Singleton
    {
        Instance = new Singleton();
    }
    private Singleton()
    {
    }
}

public class SomeOtherClass
{
    public static Singleton CompileError = new Singleton();
    public static Singleton CompileOK = Singleton.Instance;
}
于 2013-03-27T14:56:53.190 回答