带有静态构造函数的单例模式的优点是什么
本文关键字:是什么 单例模式 静态 构造函数 | 更新日期: 2023-09-27 18:35:34
我有一些代码,如下所示。我想这是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; }
}
}
首先,这个类对于具有受保护的构造函数来说有点奇怪。鉴于它是密封的,这不是致命的缺陷,但它显然很奇怪。
此代码与几乎等效使用静态变量初始值设定项之间的时间可能存在差异:
static readonly Myclass _application = new Myclass();
(当然,在这种情况下不需要二传手。
但是,您无法使用自动实现的属性来执行此操作。
以某种形式使用静态初始化可以让你"自由"的线程安全 - 你不需要做任何锁定来获得延迟初始化。
您可能会发现我的单例实现文章对更多选项感兴趣。
ctor 类型可以保证单例实例将初始化一次。在实现延迟单例初始化时,双重检查锁定模式更简单,但它具有相同原因的缺点 - 单例创建可能非常昂贵,并且单例可能永远不会在应用生命周期内使用。
与 get 方法上的延迟实例化方法相比,静态构造函数没有直接的优势,除了 Jon Skiet 的答案所指出的线程安全性。这可能与您的情况相关,也可能不相关,尽管您没有指定任何内容。它只是使代码看起来不同,但会产生相同的功能。
单例模式的"优点"是允许轻松访问类的单个实例,基本上是类的一种"全局"可访问实例。
我之所以说"优势",是因为有很多关于单例模式是一种反模式的讨论。我在围栏上。在小型应用程序中,这可以正常工作,并且大多数建议的替代解决方案都涉及依赖注入框架(通常有时具有"单例"的生命周期!),这在较小的应用程序上可能是不切实际的。
请注意,拥有一个具有protected
成员的sealed
类毫无意义 - 密封类不能继承。
如果你以这种方式编写,你可以使用 auto 属性,而不是实际实现它。
这样说:
public sealed class Myclass
{
static Myclass()
{
Myclass.Application = new Myclass();
}
.....
public static Myclass Application {get;set;}
...
}
基本上,如果不是这样的,则没有任何实践优势:代码样式。
某处创建类的实例,该实例可以位于静态构造函数中,也可以位于获取实例的属性中。
无论如何,这不是您找到的好代码示例。
- 即使它是
sealed
,它也有protected
成员,这只会使代码混乱。他们应该private
. - 如果您查看
Name
属性,您会注意到无法设置它,因此它将始终null
。
静态构造函数,它在程序集加载期间被调用...
编辑:谢谢乔恩,我错了...现在我了解 C# 中的静态构造函数被指定为仅在创建类的实例或引用静态成员时执行。