为什么在这个单例代码示例中有两个构造函数

时间:2015-03-13 09:57:35

标签: c# constructor singleton

我需要在代码和found this version (#4)中实现单例模式,这似乎符合我的需要。

public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();

// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}

private Singleton()
{
}

public static Singleton Instance
{
    get
    {
        return instance;
    }
}

}

为什么示例有两个构造函数?我确实在每个构造函数中放了Debug.Write,看到它们都是在类初始化时执行的。

我需要保留两者吗?哪一个更适合用于我自己的代码?

2 个答案:

答案 0 :(得分:2)

如果你有一个未标记为beforefieldinit的类型,那么它的静态构造函数将在你需要它之​​前被调用,这意味着,如果你不使用你的单例,它将不会被实例化

更具体地说,规范说明了

  

何时触发执行此类型的语义   初始化方法,如下:语义何时和什么   触发执行此类型初始化方法,如下:

     
      
  1. 类型可以使用类型初始化方法。
  2.   
  3. 可以将类型指定为其类型初始化方法具有宽松的语义(为方便起见,我们称之为轻松   语义BeforeFieldInit)。
  4.   
  5. 如果标记为BeforeFieldInit,则在首次访问任何静态字段时或之前执行类型的初始化方法   为该类型定义。
  6.   
  7. 如果没有标记为BeforeFieldInit,那么该类型的初始化方法将在(即被触发)执行:
  8.         

    一个。首先访问该类型的任何静态字段,或

         

    湾首次调用该类型的任何静态方法,或

         

    ℃。第一次调用   如果是值类型,则为该类型的任何实例或虚方法   或

         

    d。首次调用该类型的任何构造函数。

需要非静态构造函数,以便编译器不会创建没有参数的默认构造函数。

  

如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参数构造函数。如果直接基类没有可访问的无参数实例构造函数,则会发生编译时错误。如果类是抽象的,那么默认构造函数的声明可访问性将受到保护。否则,默认构造函数的声明可访问性是公共的。因此,默认构造函数始终为

形式

答案 1 :(得分:1)

当您第一次调用类时,无论是通过静态调用(如SingleTon.MyMember还是通过创建它的新实例),都会调用静态构造函数。当你实例化一个新实例时,总是调用另一个实例(如果是单例,则只有一次)。您应该将后者的access-modifier设置为private,以避免创建实例。

编辑:如果你有一个单例类,你将不需要两个构造函数。所有初始化都可以通过默认设置完成,您可以在其中设置该实例的所有重要成员,而静态可以省略。