静态 class 中的 C# 单例模式?
C# singleton pattern in a static class?
我的事件调度器 class 通过实施某种信号槽设计模式松散地耦合了其他 classes 的实例。
一个应用程序中应该只存在一个唯一的事件调度程序。
由于我的 Dispatcher
class——完成所有工作——继承自 Dictionary<TKey, TValue>
,它不能被声明为静态的。
为了克服这个限制,我实现了一个主要的静态包装器 class EVD
和一个私有的 属性 evd
,它提供了 Dispatcher
单例,以及使用 public 静态方法 Subscribe
、UnSubscribe
和 Dispatch
,它们包装了单例的相应方法:
namespace EventDispatcher
{
public static class EVD
{
static Dispatcher evd { get { return Singleton<Dispatcher>.Instance; } }
public static void Subscribe(string name, EvtHandler handler)
{
evd.Subscribe(name, handler);
}
public static void UnSubscribe(string name, EvtHandler handler = null)
{
evd.UnSubscribe(name, handler);
}
public static void Dispatch(string name, object sender, EvtArgs e = null)
{
evd.Dispatch(name, sender, e);
}
}
class Dispatcher : Dictionary<string, Event> { /* main event dispatcher */ }
static class Singleton<T> where T : /* generic singleton creation */
}
所以这是我的问题:
在静态 class 中创建单例实例真的有意义吗? AFAIK a static class 无论如何都是独一无二的。因此,最好不要像这样创建单例并声明 evd
属性:
static Dispatcher evd = new Dispatcher();
在那种情况下,惰性实例化和线程安全性如何?至少通用单例 class 使用 Lazy<T>
并且据说是线程安全的。
或者我应该像这样声明 属性 更好:
static Dispatcher _evd;
static Dispatcher evd
{
get { return _evd ?? (_evd = new Dispatcher()); }
}
恐怕我不完全理解所有那些惰性实例化和线程安全的东西...
感谢您的帮助,Don P
不,因为你不能创建静态的实例class只有一个字段的副本,所以不需要使用单例模式.
将构造放在静态构造函数中,保证只调用一次,因此自动线程安全: https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
额外参考:它看起来对应于"Employee Type Object"里面的"static field"这里:http://www.rvenables.com/linkjackandsufferaccidentaldroptable/clr_via_csharp_f4.9.png
我的事件调度器 class 通过实施某种信号槽设计模式松散地耦合了其他 classes 的实例。
一个应用程序中应该只存在一个唯一的事件调度程序。
由于我的 Dispatcher
class——完成所有工作——继承自 Dictionary<TKey, TValue>
,它不能被声明为静态的。
为了克服这个限制,我实现了一个主要的静态包装器 class EVD
和一个私有的 属性 evd
,它提供了 Dispatcher
单例,以及使用 public 静态方法 Subscribe
、UnSubscribe
和 Dispatch
,它们包装了单例的相应方法:
namespace EventDispatcher
{
public static class EVD
{
static Dispatcher evd { get { return Singleton<Dispatcher>.Instance; } }
public static void Subscribe(string name, EvtHandler handler)
{
evd.Subscribe(name, handler);
}
public static void UnSubscribe(string name, EvtHandler handler = null)
{
evd.UnSubscribe(name, handler);
}
public static void Dispatch(string name, object sender, EvtArgs e = null)
{
evd.Dispatch(name, sender, e);
}
}
class Dispatcher : Dictionary<string, Event> { /* main event dispatcher */ }
static class Singleton<T> where T : /* generic singleton creation */
}
所以这是我的问题:
在静态 class 中创建单例实例真的有意义吗? AFAIK a static class 无论如何都是独一无二的。因此,最好不要像这样创建单例并声明 evd
属性:
static Dispatcher evd = new Dispatcher();
在那种情况下,惰性实例化和线程安全性如何?至少通用单例 class 使用 Lazy<T>
并且据说是线程安全的。
或者我应该像这样声明 属性 更好:
static Dispatcher _evd;
static Dispatcher evd
{
get { return _evd ?? (_evd = new Dispatcher()); }
}
恐怕我不完全理解所有那些惰性实例化和线程安全的东西...
感谢您的帮助,Don P
不,因为你不能创建静态的实例class只有一个字段的副本,所以不需要使用单例模式.
将构造放在静态构造函数中,保证只调用一次,因此自动线程安全: https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
额外参考:它看起来对应于"Employee Type Object"里面的"static field"这里:http://www.rvenables.com/linkjackandsufferaccidentaldroptable/clr_via_csharp_f4.9.png