99

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

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

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

4

10 回答 10

241

如果您想声明字典一次并且从不更改它,则将其声明为只读:

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

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

查看 ReadOnlyCollection 以供参考。

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

于 2008-11-24T03:30:42.470 回答
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"} };
    }
}
于 2008-11-24T03:23:42.950 回答
5

老问题,但我发现这很有用。事实证明,还有一个专门的 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将返回 null StringDictionary,但如果是 将抛出异常Dictionary<string, string>。有关更多信息,请参阅他提到的 SO 帖子,这是此编辑的来源。

于 2011-03-29T15:08:17.720 回答
3

创建静态构造函数以在 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");
    }
}
于 2013-04-18T08:29:51.270 回答
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也是一个好主意,这里讨论的修饰符都不会阻止字典本身被修改。

于 2008-11-24T03:38:42.640 回答
0

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

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}
于 2008-11-24T03:13:39.883 回答
0

使 Dictionary 成为静态的,并且永远不要在静态对象的 ctor 之外添加它。这似乎是一个比摆弄 C# 中的静态/常量规则更简单的解决方案。

于 2008-11-24T03:21:40.553 回答
0

好的 - 所以我在 ASP 2.x 中工作(不是我的选择......但是,嘿,谁在婊子?)。

没有一个初始化字典示例将起作用。然后我遇到了这个: http: //kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

...这让我意识到不能在 ASP 2.x 中使用集合初始化。

于 2010-05-25T17:17:53.257 回答
0

使用公共静态属性字典并将静态私有字典包装在里面。然后你只需要关心可变或不可变类型,第一个你需要在包装器中迭代。这允许您阅读字典,但不能编辑它(不是条目,也不是整个参考),并可以选择允许使用您喜欢的任何身份验证模型在 set{} 部分内进行编辑。

(我一直在寻找不同的东西,比如并行编码中的静态性能,看到了这个搜索结果,发现缺少包装器方法。)

对于那些不知道包装是什么的人,这里有一个非静态示例(您可以轻松添加静态关键字):

public Dictionary<string, Boolean> Access
{
    get
    {
        // Same here, iterate if needed..
        return new Dictionary<string, Boolean>(prv_Access);
    }
    set
    {
        MainWindow.NewSession.Renew();
        if (MainWindow.NewSession.Actual)
        {
            prv_HistoryAccess.Add(DateTime.Now, new Dictionary<string, Boolean>(prv_Access));

            // Here you would need to iterate when you deal with mutables..
            prv_Access = value;
        }
    }
}
于 2021-10-02T18:31:38.540 回答
-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"} };             
    }
}

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

于 2008-11-24T03:11:50.137 回答