如何在静态类中声明静态字典对象?我试过了
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
{
{ "1", "User name or password problem" }
};
}
但是编译器抱怨“除了字符串之外的引用类型的const字段只能用null 初始化”。
答案 0 :(得分:202)
如果您想要一次声明字典并且从不更改它,那么将其声明为readonly:
private static readonly Dictionary<string, string> ErrorCodes
= new Dictionary<string, string>
{
{ "1", "Error One" },
{ "2", "Error Two" }
};
如果您希望字典项只读(不仅是引用而且还是集合中的项),那么您将不得不创建一个实现IDictionary的只读字典类。
查看ReadOnlyCollection以供参考。
BTW const只能在内联声明标量值时使用。
答案 1 :(得分:8)
正确的语法(在VS 2008 SP1中测试)是:
public static class ErrorCode
{
public static IDictionary<string, string> ErrorCodeDic;
static ErrorCode()
{
ErrorCodeDic = new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
}
答案 2 :(得分:4)
老问题,但我觉得这很有用。事实证明,还有一个专门的类,使用字符串来表示键和值:
private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
{ "1", "Unrecognized segment ID" },
{ "2", "Unexpected segment" }
};
修改:根据下面的Chris的评论,Dictionary<string, string>
超过StringDictionary
通常是首选,但这取决于您的具体情况。如果您正在处理较旧的代码库,则可能仅限于StringDictionary
。另请注意以下行:
myDict["foo"]
如果myDict
是StringDictionary
,将返回null,但Dictionary<string, string>
的情况下会抛出异常。有关详细信息,请参阅SO post he mentioned,这是此修改的来源。
答案 3 :(得分:1)
您的初始示例的问题主要是由于使用const
而不是static
;你不能在C#中创建一个非空的const引用。
我相信这也会奏效:
public static class ErrorCode
{
public static IDictionary<string, string> ErrorCodeDic
= new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
另外,正如Y Low指出的那样,添加readonly
也是一个好主意,这里讨论的修饰符都不会阻止字典本身被修改。
答案 4 :(得分:1)
创建一个静态构造函数以在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");
}
}
答案 5 :(得分:0)
使字典成为静态,并且永远不要在静态对象的ctor之外添加它。这似乎比摆弄C#中的static / const规则更简单。
答案 6 :(得分:0)
好的 - 所以我在ASP 2.x工作(不是我的选择......但嘿,谁在婊子?)。
初始化的Dictionary示例都不起作用。然后我遇到了这个: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx
...这让我觉得无法在ASP 2.x中使用集合初始化。
答案 7 :(得分:-1)
您可以使用static / class构造函数初始化字典:
public static class ErrorCode
{
public const IDictionary<string, string> ErrorCodeDic;
public static ErrorCode()
{
ErrorCodeDic = new Dictionary<string, string>()
{ {"1", "User name or password problem"} };
}
}
答案 8 :(得分:-2)
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"} };
}
}
可能在构造函数中初始化。