在静态类中声明一个Dictionary

时间:2008-11-24 03:08:00

标签: c# .net dictionary

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

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

但是编译器抱怨“除了字符串之外的引用类型的const字段只能用null 初始化”。

9 个答案:

答案 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"]
如果myDictStringDictionary

将返回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"} };             
    }
}

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