如何防止创建另一个字典

时间:2017-08-10 19:49:30

标签: c# dictionary

每次有人调用特定函数时,我都会创建一个字典。问题是我需要在不同的地方使用字典。我使用过谷歌,但没有什么可以帮助我解决我的具体问题。

实施例: 我创建了字典

private void ConnectFunc(client)
    {
     CreateDict();
    }

然后我尝试将创建的dict返回到处使用

public static IDictionary<int, int> CreateDict()
  {
    Dict = new Dictionary<int, int>();
    return Dict;
  }

但是现在我必须确保脚本不再创建新词典,这怎么可能? (我刚开始学习C#,所以请解释并告诉我我做错了什么。)

2 个答案:

答案 0 :(得分:1)

查看Singleton pattern

有助于在早期熟悉基本设计模式,您将学到很多东西。

编辑:示例

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()函数(如果它只是创建一个新的字典)。