gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:21:51 25 4
gpt4 key购买 nike

我的事件调度器类通过实现某种信号槽设计模式松散地耦合了其他类的实例。

一个应用程序中应该只存在一个唯一的事件调度程序。自从我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com