每次有人调用特定函数时,我都会创建一个字典。问题是我需要在不同的地方使用字典。我使用过谷歌,但没有什么可以帮助我解决我的具体问题。
实施例: 我创建了字典
private void ConnectFunc(client)
{
CreateDict();
}
然后我尝试将创建的dict返回到处使用
public static IDictionary<int, int> CreateDict()
{
Dict = new Dictionary<int, int>();
return Dict;
}
但是现在我必须确保脚本不再创建新词典,这怎么可能? (我刚开始学习C#,所以请解释并告诉我我做错了什么。)
答案 0 :(得分:1)
有助于在早期熟悉基本设计模式,您将学到很多东西。
编辑:示例
public sealed class MyDictionary
{
private static readonly Dictionary<int, int> instance = new Dictionary<int, int>();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static MyDictionary()
{
}
private MyDictionary()
{
}
public static IDictionary<int, int> Instance
{
get
{
return instance;
}
}
}
用法:
private void ConnectFunc(client)
{
// get the singleton instance of your dictionary: MyDictionary.Instance
}
答案 1 :(得分:1)
所以你要做的就是&#34; Singleton&#34;图案。 &#34;单例&#34;基本上意味着你只想拥有一个对象的实例。
一个简单的例子:
private static IDictionary<int, int> _dict = null;
public static IDictionary<int, int> CreateDict()
{
if(_dict == null)
{
_dict = new Dictionary<int, int>();
}
return _dict;
}
Singletons要记住的一件事是线程安全。在上面的示例中,如果一个线程在另一个线程检查null的同时检查null,会发生什么。他们都发现_dict
为空并创建新的词典。现在你有两个独特的词典浮动在那里。
我最喜欢的处理方式来自blog post Jon Skeet写道。这利用了.NET 4的Lazy<T>
类型:
private static Lazy<IDictionary<int, int>> _lazyDict =
new Lazy<IDictionary<int, int>>(() => new Dictionary<int, int>());
public static IDictionary<int, int> Dict { get { return lazy.Value; } }
这种方法是线程安全的,并且具有延迟加载的好处,而且你可以消除CreateDict()
函数(如果它只是创建一个新的字典)。