C静态类中的单例模式?

C# singleton pattern in a static class?

我的事件调度员类低价夫妻个案的其他类别实施信号槽设计模式。

只有一个事件调度器被认为存在于一个应用中。自从我开始工作的那一类——从Dictionary开始,它就不能被宣布为静态。

为了克服这一局限性,我以私人财产EVD的形式实施了一个主要的静态编辑EVD,其中包括提供EDOCX1〕〔0〕的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 */
}

所以这是我的问题

这真的让人有理由在一个静态类中创建一个单一的实例吗?阿法克一个固定班是独一无二的。因此,这可能是最好的做法,而不是创建单曲和宣告EVD

ZZU1

Lazy Intantiation and Thread Safety in this case?最起码通用的Singleton等级使用Lazy,并表示将受到威胁。

或者我应该更好地宣布财产如此:

1
2
3
4
5
static Dispatcher _evd;
static Dispatcher evd
{
    get { return _evd ?? (_evd = new Dispatcher()); }
}

我害怕我无法完全理解所有的懒惰的安装和威胁

谢谢你的帮助


不,因为您不能创建静态类的实例,所以字段只有一个副本,所以不需要使用单例模式。

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

额外参考:它看起来与"Employee Type Object"中的"Static Field"相对应:http://www.rvenables.com/linkjackandsureaccidentaldroptable/clr_via_csharp_f4.9.png