在静态类中声明一个字典

如何在静态类中声明静态字典对象? 我试过了

public static class ErrorCode { public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>() { { "1", "User name or password problem" } }; } 

但是编译器会抱怨:“ 除了string以外的引用types的const字段只能用null初始化 ”。

如果你想声明一次字典而不改变它,那么声明它是只读的:

 private static readonly Dictionary<string, string> ErrorCodes = new Dictionary<string, string> { { "1", "Error One" }, { "2", "Error Two" } }; 

如果你想把项目字典只读(不只是引用,而且还包括集合中的项目),那么你将不得不创build一个实现IDictionary的只读字典类。

查阅ReadOnlyCollection以供参考。

BTW常量只能用于内联声明标量值。

正确的语法(在VS 2008 SP1中testing)是这样的:

 public static class ErrorCode { public static IDictionary<string, string> ErrorCodeDic; static ErrorCode() { ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } } 

老问题,但我发现这有用。 原来,还有一个字典使用键和值的string的专门类:

 private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary { { "1", "Unrecognized segment ID" }, { "2", "Unexpected segment" } }; 

编辑:下面的每个克里斯的评论,使用Dictionary<string, string> over StringDictionary通常是首选,但将取决于您的情况。 如果您正在处理较旧的代码库,则可能仅限于StringDictionary 。 另外,请注意以下行:

 myDict["foo"] 

如果myDictStringDictionary ,将返回null,但在Dictionary<string, string>情况下将抛出exception。 看到他提到的SOpost了解更多信息,这是编辑的来源。

你最初的例子的问题主要是由于使用const而不是static 。 你不能在C#中创build一个非null的const引用。

我相信这也会起作用:

 public static class ErrorCode { public static IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } 

此外,正如Y Low指出的那样,添加readonly也是一个好主意,而且这里讨论的修饰符都不会阻止字典本身被修改。

创build一个静态构造函数来在Dictionary中添加值

 enum Commands { StudentDetail } public static class Quires { public static Dictionary<Commands, String> quire = new Dictionary<Commands, String>(); static Quires() { quire.add(Commands.StudentDetail,@"SELECT * FROM student_b"); } } 

使词典是一个静态的,永远不会添加到你的静态对象的外部。 这似乎是比C#中的静态/常量规则摆弄更简单的解决scheme。

好的 – 所以我在ASP 2.x(不是我的select…但嘿谁是婊子?)工作。

没有初始化字典的例子会工作。 然后我碰到这个: http : //kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

这让我不能在ASP 2.x中使用集合初始化的事实。

您可以使用静态/类构造函数来初始化您的字典:

 public static class ErrorCode { public const IDictionary<string, string> ErrorCodeDic; public static ErrorCode() { ErrorCodeDic = new Dictionary<string, string>() { {"1", "User name or password problem"} }; } } 
 public static class ErrorCode { public const IDictionary<string , string > m_ErrorCodeDic; public static ErrorCode() { m_ErrorCodeDic = new Dictionary<string, string>() { {"1","User name or password problem"} }; } } 

可能在构造函数中初始化。