我有一些代码,如下所示。我想这是Singleton
模式。为什么我需要一个静态构造函数。这也有什么好处?谢谢你的回复...
public sealed class Myclass
{
static Myclass()
{
Myclass.Application = new Myclass();
}
protected Myclass()
{
}
static Myclass _application;
public static Myclass Application
{
get { return Myclass._application; }
protected set { Myclass._application = value; }
}
string _name;
public string Name
{
get { return _name}
protected set { _name= value; }
}
}
答案 0 :(得分:6)
首先,对于拥有 protected 构造函数,这个类有些奇怪。鉴于它是密封的,这不是一个致命的缺陷,但它显然是奇怪的。
此代码与静态变量初始化程序几乎等效的使用之间存在potential difference in timing:
static readonly Myclass _application = new Myclass();
(当然,在这种情况下不需要安装者。)
但是,您无法使用自动实现的属性执行此操作。
在某些形式中使用静态初始化可以让您“免费”获得线程安全性 - 您无需进行任何锁定即可进行延迟初始化。
您可能会发现我的singleton implementation article对于更多选项感兴趣。
答案 1 :(得分:0)
静态构造函数没有直接的优势,而是在get方法上进行惰性实例化,而不像Jon Skeet的回答所指出的线程安全性。这可能与您的情况相关,也可能不相关,但您没有指定任何内容。它只是使代码看起来不同,但会产生相同的功能。
单例模式的“优点”是允许轻松访问类的单个实例,基本上是类的“全局”可访问实例。
我说“优势”,因为有很多关于Singleton模式是反模式的讨论。我在围栏上。在一个小应用程序中,这可以正常运行,并且大多数提议的替代解决方案都涉及依赖注入框架(通常有时会使用“Singleton”的生命周期!),这对于较小的应用程序可能不切实际。
只是注意,拥有sealed
类protected
成员是没有意义的 - 密封的类不能被继承。
答案 2 :(得分:0)
如果您以这种方式编写,则可以使用 auto 属性,而不是实际实现。
这样说:
public sealed class Myclass
{
static Myclass()
{
Myclass.Application = new Myclass();
}
.....
public static Myclass Application {get;set;}
...
}
基本上,没有任何 practcal 优势,如果不是这样的:代码风格。
答案 3 :(得分:0)
这里使用类型ctor可以保证单例实例初始化一次。在实现延迟单例初始化时,双重检查锁模式更简单,但它有同样的原因 - 单例创建可能非常昂贵,并且在应用程序生命周期内可能永远不会使用单例。
答案 4 :(得分:0)
您必须在某处创建类的实例,并且可以在静态构造函数中,也可以在获取实例的属性中。
无论如何,它找不到你找到的好代码示例。
protected
个成员,即使它是sealed
,这只会让代码混乱。它们应该是private
。Name
属性,您会注意到无法设置它,因此它始终为null
。答案 5 :(得分:-1)
静态构造函数在加载程序集时调用它......
修改强> 谢谢,我错了...... 现在我理解C#中的静态构造函数被指定为仅在创建类的实例或引用静态成员时执行..