C# StringDictionary作为通用静态列表?

C# StringDictionary作为通用静态列表?,c#,stringdictionary,C#,Stringdictionary,我试图做的是有一个项目方面的静态字典,这样我就可以从代码中的任何地方访问单个列表 到目前为止,我提出了这个解决方案,一个具有公共属性的公共静态类: public static class Common { public static StringDictionary Domains { get { StringDictionary list = new StringDictionary(); lis

我试图做的是有一个项目方面的静态字典,这样我就可以从代码中的任何地方访问单个列表

到目前为止,我提出了这个解决方案,一个具有公共属性的公共静态类:

public static class Common
{
    public static StringDictionary Domains
    {
        get
        {
            StringDictionary list = new StringDictionary();

            list.Add("212", "Location A");
            list.Add("555", "Location B");
            list.Add("747", "Location C");
            list.Add("000", "Location D");

            return list;
        }
    }
}
以这种方式使用(我使用它替换gridview中单元格的内容):

但我不知道这是否是一个有效的解决方案,和/或是否有其他(更好的)方法来做到这一点。。。有人能给个提示吗


提前谢谢你,Andrea。

每次你登录
域时,你的词典都会被重新加载


配置一个静态构造函数,该构造函数将加载并将
列表的只读静态副本存放在内存中。

您可能不希望每次访问属性时都重新创建列表。将构造移动到静态构造函数中:

public static class Common
{
    private static StringDictionary _domains;
    static Common()
    {
        _domains = new StringDictionary();
        _domains.Add("212", "Location A");
        _domains.Add("555", "Location B");
        _domains.Add("747", "Location C");
        _domains.Add("000", "Location D");
    }
    public static StringDictionary Domains
    {
        get
        {
            return _domains;
        }
    }
}
lock(Common.Domains) {
    Common.Domains.Add("111", "Location 3");
}

您应该知道,返回的词典不是只读的。因此,此类客户机可以修改集合(例如,添加/删除某些条目)。

请考虑改用单例模式:

这不是必须的,因为每个程序都有自己的特殊需求,我只建议您阅读此模式并重新思考您的设计


如果您的程序是多线程的,您可能需要检查StringDictionary是否是线程安全的,如果它不是线程安全的(并且您的程序是多线程的),您应该向类中添加一些同步机制。

@Jeff Fritz的回答是正确的,但是我只是想补充一点关于多线程共享访问这个字段的内容。StringDictionary仅对读取操作是线程安全的,而对写入操作不是线程安全的,因此您需要小心不要在没有正确锁定的情况下修改此集合,并且在对集合进行迭代时还需要锁定该集合

要迭代:

lock(Common.Domains) {
    foreach(var domain in Common.Domains) {
    }
}
要在静态构造函数之外添加域,请执行以下操作:

public static class Common
{
    private static StringDictionary _domains;
    static Common()
    {
        _domains = new StringDictionary();
        _domains.Add("212", "Location A");
        _domains.Add("555", "Location B");
        _domains.Add("747", "Location C");
        _domains.Add("000", "Location D");
    }
    public static StringDictionary Domains
    {
        get
        {
            return _domains;
        }
    }
}
lock(Common.Domains) {
    Common.Domains.Add("111", "Location 3");
}
通常,在通过静态字段共享非只读集合时,我会非常小心,以免修改该字段。您可能希望将StringDictionary改为ReadOnlyCollection,并将字段标记为“readonly”:

公共静态只读只读集合域

您不会得到O(1)个查找,但我假设此集合将非常小,所以这并不重要。

Edit:我发现了一些关于Dictionary vs StringDictionary的讨论,Dictionary对我来说也是可行的(但它与问题无关)。感谢您的回复Martin,这正是我想要的!您还应该考虑与通过静态字段共享集合相关的所有线程问题。这是一个非常棘手的领域,我在回答中已经详细阐述了这一点。