- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的事件调度器类通过实现某种信号槽设计模式松散地耦合了其他类的实例。
一个应用程序中应该只存在一个唯一的事件调度程序。自从我的 Dispatcher
类——完成所有工作——继承自 Dictionary<TKey, TValue>
, 它不能被声明为静态的。
为了克服这个限制,我实现了一个主要的静态包装器类 EVD
拥有私有(private)属性(property)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 */
}
所以这是我的问题:
在静态类中创建单例实例真的有意义吗?无论如何,AFAIK 静态类是唯一的。因此,最好不要创建单例并声明 evd
。属性就像这样:
static Dispatcher evd = new Dispatcher();
在这种情况下,惰性实例化和线程安全性如何?至少通用单例类使用 Lazy<T>
据说是线程安全的。
或者我应该像这样声明属性:
static Dispatcher _evd;
static Dispatcher evd
{
get { return _evd ?? (_evd = new Dispatcher()); }
}
恐怕我不完全理解所有那些惰性实例化和线程安全的东西......
谢谢你的帮助,Don P
最佳答案
不,因为您不能创建静态类的实例,所以只有一个字段副本,所以不需要使用单例模式。
将构造放在静态构造函数中,保证只调用一次,从而自动线程安全:https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
额外引用:它看起来对应于此处“员工类型对象”中的“静态字段”:http://www.rvenables.com/linkjackandsufferaccidentaldroptable/clr_via_csharp_f4.9.png
关于静态类中的 C# 单例模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30005970/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!