静态构造函数和单例
Static Constructor and singleton
朋友告诉我下面是在C#
中创建singleton design pattern
的方法之一
public class class1{
public static class1 Obj { get; private set; }
static class1()
{
Obj = new class1();
}
}
他告诉我静态构造函数在应用程序中只运行一次,所以只会创建一个class1
实例,
但我看到我必须添加这个 if(Obj==null)
来检查对象
的存在
public class class1{
public static class1 Obj { get; private set; }
static class1()
{
**if(Obj==null)**
Obj = new class1();
}
}
哪个代码是正确的?
假设唯一设置Obj
的地方是在static
构造函数中,第一个代码片段是正确的;第二个代码片段是多余的。
因为 static
个构造函数 运行 每个 class 只有一次。如果没有其他路径设置Obj
,它的值将永远是static
构造函数开头的null
。因此,检查 if(Obj==null)
总是会成功,这使得它变得多余。
static constructor
只会被调用一次,在分配静态变量之前的某个时刻。
这意味着您的朋友是正确的,您不需要 if
声明 - 它是多余的。
这是因为您不能手动调用 static constructor
,它只会在 运行 时间开始时调用一次。
进一步阅读:
朋友告诉我下面是在C#
singleton design pattern
的方法之一
public class class1{
public static class1 Obj { get; private set; }
static class1()
{
Obj = new class1();
}
}
他告诉我静态构造函数在应用程序中只运行一次,所以只会创建一个class1
实例,
但我看到我必须添加这个 if(Obj==null)
来检查对象
public class class1{
public static class1 Obj { get; private set; }
static class1()
{
**if(Obj==null)**
Obj = new class1();
}
}
哪个代码是正确的?
假设唯一设置Obj
的地方是在static
构造函数中,第一个代码片段是正确的;第二个代码片段是多余的。
因为 static
个构造函数 运行 每个 class 只有一次。如果没有其他路径设置Obj
,它的值将永远是static
构造函数开头的null
。因此,检查 if(Obj==null)
总是会成功,这使得它变得多余。
static constructor
只会被调用一次,在分配静态变量之前的某个时刻。
这意味着您的朋友是正确的,您不需要 if
声明 - 它是多余的。
这是因为您不能手动调用 static constructor
,它只会在 运行 时间开始时调用一次。
进一步阅读: