2

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

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

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中单元格的内容):

if (Common.Domains.ContainsKey(e.Row.Cells[5].Text))
{
    e.Row.Cells[5].Text = Common.Domains[e.Row.Cells[5].Text];
}
else
{
    e.Row.Cells[5].Text = "n/a";
}

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

在此先感谢,安德里亚。

4

4 回答 4

3

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

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;
        }
    }
}

您应该知道,返回的字典不是只读的。所以这个类的客户端可以修改集合(例如添加/删除一些条目)。

于 2009-04-16T15:44:41.853 回答
0

每次你上车时,你的字典都会重新加载Domains

list配置一个静态构造函数,它将加载实例字典的只读静态副本并将其存储在内存中。

于 2009-04-16T15:44:24.350 回答
0

考虑改用单例模式:

http://en.wikipedia.org/wiki/Singleton_pattern

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

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

于 2009-04-16T15:47:11.330 回答
0

@Jeff Fritz 在他的回答中是正确的,但我只想添加更多关于该字段在多个线程之间的共享访问。StringDictionary仅对读操作是线程安全的,而不是写操作,因此您需要注意不要在没有适当锁定的情况下修改此集合,并且您还需要在迭代集合时锁定该集合。

迭代:

lock(Common.Domains) {
    foreach(var domain in Common.Domains) {
    }
}

要在静态构造函数之外添加域:

lock(Common.Domains) {
    Common.Domains.Add("111", "Location 3");
}

通常,在通过静态字段共享非只读集合时,我会非常小心,以免修改该字段。您可能希望将StringDictionary改为ReadOnlyCollection并将字段标记为“只读” :

public static readonly ReadOnlyCollection<Pair<string, string>> domains

你不会得到 O(1) 查找,但我假设这个集合会非常小,所以无论如何这都无关紧要。

于 2009-04-16T19:24:38.687 回答