我需要在代码和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
,看到它们都是在类初始化时执行的。
我需要保留两者吗?哪一个更适合用于我自己的代码?
答案 0 :(得分:2)
如果你有一个未标记为beforefieldinit
的类型,那么它的静态构造函数将在你需要它之前被调用,这意味着,如果你不使用你的单例,它将不会被实例化
更具体地说,规范说明了
何时触发执行此类型的语义 初始化方法,如下:语义何时和什么 触发执行此类型初始化方法,如下:
- 类型可以使用类型初始化方法。
- 可以将类型指定为其类型初始化方法具有宽松的语义(为方便起见,我们称之为轻松 语义BeforeFieldInit)。
- 如果标记为BeforeFieldInit,则在首次访问任何静态字段时或之前执行类型的初始化方法 为该类型定义。
- 如果没有标记为BeforeFieldInit,那么该类型的初始化方法将在(即被触发)执行:
醇>一个。首先访问该类型的任何静态字段,或
湾首次调用该类型的任何静态方法,或
℃。第一次调用 如果是值类型,则为该类型的任何实例或虚方法 或
d。首次调用该类型的任何构造函数。
需要非静态构造函数,以便编译器不会创建没有参数的默认构造函数。
如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参数构造函数。如果直接基类没有可访问的无参数实例构造函数,则会发生编译时错误。如果类是抽象的,那么默认构造函数的声明可访问性将受到保护。否则,默认构造函数的声明可访问性是公共的。因此,默认构造函数始终为
形式
答案 1 :(得分:1)
当您第一次调用类时,无论是通过静态调用(如SingleTon.MyMember
还是通过创建它的新实例),都会调用静态构造函数。当你实例化一个新实例时,总是调用另一个实例(如果是单例,则只有一次)。您应该将后者的access-modifier设置为private,以避免创建实例。
编辑:如果你有一个单例类,你将不需要两个构造函数。所有初始化都可以通过默认设置完成,您可以在其中设置该实例的所有重要成员,而静态可以省略。