我要做的是拥有一个项目方面的静态字典,这样我就可以从代码中的任何位置访问单个列表。
到目前为止,我想出了这个解决方案,一个带有公共属性的公共静态类:
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";
}
但我不知道这是否是一个有效的解决方案,和/或是否有其他(更好)的方法来做到这一点......有人可以提示吗?
先谢谢,安德烈。
答案 0 :(得分: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;
}
}
}
你应该知道,返回的字典不是只读的。因此,此类的客户端可以修改集合(例如,添加/删除一些条目)。
答案 1 :(得分:0)
每次进入Domains
配置一个静态构造函数,该构造函数将在内存中加载并存储list
实例字典的只读静态副本。
答案 2 :(得分:0)
请考虑使用Singleton模式:
http://en.wikipedia.org/wiki/Singleton_pattern
这不是必须的,因为每个程序都有自己的特殊需求,我只建议您阅读有关此模式并重新考虑您的设计。
如果您的程序是多线程的,您可能想检查StringDictionary是否是线程安全的,如果它不是线程安全的(并且您的程序是多线程的),您应该为您的类添加一些同步机制。
答案 3 :(得分:0)
@Jeff Fritz的答案是正确的,但我只是想在多个线程中添加更多关于该字段的共享访问权限。 StringDictionary 对于读取操作只是线程安全的,而不是写入操作,因此您需要注意不要在没有正确锁定的情况下修改此集合,并且您还希望在以后锁定集合迭代它。
迭代:
lock(Common.Domains) {
foreach(var domain in Common.Domains) {
}
}
在外部添加域静态构造函数:
lock(Common.Domains) {
Common.Domains.Add("111", "Location 3");
}
通常,在通过静态字段共享非只读集合时要非常小心,以便不修改字段。您可能希望将 StringDictionary 改为 ReadOnlyCollection 并将字段标记为“readonly”:
public static readonly ReadOnlyCollection<Pair<string, string>> domains
你不会得到O(1)查询,但我假设这个集合非常小,所以无论如何都无关紧要。