静态类中的C#单例模式?

Don*_*n P 5 c# singleton static

我的事件调度程序类通过实现一些信号槽设计模式松散地耦合其他类的实例.

应用程序中只应存在一个唯一的事件调度程序.由于我的Dispatcher类 - 它完成了所有工作 - 继承自Dictionary<TKey, TValue>,因此不能将其声明为静态.

为了克服这个限制,我实现了一个主要的静态包装类EVD与私有财产evd提供了Dispatcher单,与公众的静态方法一起Subscribe,UnSubscribeDispatch,其包装单身的相应的方法:

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 */
}
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题:

在静态类中创建单例实例真的有意义吗?AFAIK静态类无论如何都是独一无二的.所以也许最好的做法是不创建单例并声明evd属性就像这样:

static Dispatcher evd = new Dispatcher();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,懒惰的实例化和线程安全性如何?至少通用单例类使用Lazy<T>并且被认为是线程安全的.

或者我应该更好地声明属性如下:

static Dispatcher _evd;
static Dispatcher evd 
{ 
    get { return _evd ?? (_evd = new Dispatcher()); }
}
Run Code Online (Sandbox Code Playgroud)

我担心我不完全理解所有懒惰的instatantiation和线程安全的东西......

感谢任何帮助,Don P.

Mat*_*ias 4

不,由于您无法创建静态类的实例,因此该字段只会有一份副本,因此无需使用 Singleton 模式

将构造放在静态构造函数中,保证仅调用一次,从而自动实现线程安全https ://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx

额外参考:它看起来对应于“员工类型对象”内的“静态字段”:http ://www.rvenables.com/linkjackandsufferaccidentaldroptable/clr_via_csharp_f4.9.png