在静态类中声明字典


90

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

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

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


1
您不能将const与Dictionary类型一起使用,而只能与标量值一起使用。(检查我的回答)msdn.microsoft.com/zh-CN/library/e6w8fe1b
VS.71

Answers:


214

如果您只想声明一次字典而从不对其进行更改,则将其声明为只读:

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

如果要将字典项设为只读(不只是引用,还希望集合中的项成为字典),则必须创建一个实现IDictionary的只读字典类。

查看ReadOnlyCollection以供参考。

BTW const只能在内联声明标量值时使用。


在循环中使用类级私有静态变量私有静态Dictionary <string,string> ErrorCodes,然后在相应的函数中检查if(ErrorCodes == null){fill dictionary}以缓存值时,怎么样?
LifeOfPi '17

1
如果您不希望更改字典,则可以将其包装到中ReadOnlyDictionary。一种更有效的方法(但安全性较低)是将其分配给IReadOnlyDictionary类型。
拉蒙·

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

但这不会阻止使用类修改内容。
Everts

4

老问题了,但是我发现这很有用。事实证明,还有一个专门用于Dictionary的类,它使用字符串作为键和值:

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

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

myDict["foo"]

如果myDict为a StringDictionary,则将返回null ,但如果为,则将引发异常Dictionary<string, string>。请参阅他提到SO帖子以获取更多信息,这是此编辑的来源。



这正是我所链接的问题。
克里斯·摩根

1
哇,什至没有抓住-碰巧找到了同一个。我无法编辑评论,所以我只编辑了帖子以将其汇总在一个地方。谢谢!

1

您最初的示例的问题主要是由于使用const而不是static; 您不能在C#中创建非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也是一个好主意,并且这里讨论的修饰符都不会阻止字典本身被修饰。


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

1
查询或查询?
阿什

0

将字典设为静态,切勿在静态对象的ctor之外添加字典。这似乎比摆弄C#中的static / const规则更简单。



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

1
您是要使字典静态化吗?您不能拥有const。如错误消息所述,仅值类型,字符串或null可以为const
Orion Edwards

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.