如何初始化 ReadOnlyDictionary?

How to initialise ReadOnlyDictionary?

我有一个不变的字典,公开在 class.

目前我的代码看起来像

using System.Collections.Generic;
using System.Collections.ObjectModel;

public class FooClass
{
    private static ReadOnlyDictionary<string, byte> _validRevisions 
        = new ReadOnlyDictionary<string, byte>(
            new Dictionary<string, byte>() { 
                { "1.0", 0x00 },
                { "1.1", 0x01 },
                { "1.2", 0x02 },
                { "1.3", 0x03 }
            } );

    public static ReadOnlyDictionary<string, byte> ValidRevisions => _validRevisions;

    // other FooClass contents...
}

我使用了支持字段 _validRevisions,因为我想不出更好的方法来创建共享常量字典 属性。有没有更好的方法来管理这个,或者我应该把这个字段设为 public?

我的主要问题是有没有更短的方法来初始化 _validRevisions 字段本身?创建内联字典以将其传递到字典(碰巧是只读的)似乎有点……代码味道。是吗?有没有更好的方法?

编辑:我刚刚注意到关于 ROD 的另一件事,没有方法可以支持检查它是否包含给定值...是否有与它的只读相关的原因?

ReadOnlyDictionary<TKey, TValue> is just a wrapper around a normal dictionary and there is only one constructor 初始化它需要另一个 Dictionary 实例。

所以没有,没有更短的方法。但是我会使用 static constructor 来初始化复杂的静态对象:

private static ReadOnlyDictionary<string, byte> _validRevisions;

static FooClass()
{
    IDictionary<string, byte> dict = new Dictionary<string, byte>() { 
            { "1.0", 0x00 },
            { "1.1", 0x01 },
            { "1.2", 0x02 },
            { "1.3", 0x03 }
        };
    _validRevisions = new ReadOnlyDictionary<string, byte>(dict);
}

如果您不介意使用 IReadOnlyDictionary 而不是 ReadOnlyDictionary,您可以使用它,因为 Dictionary 实现了 IReadOnlyDictionary:

private static IReadOnlyDictionary<string, byte> _validRevisions
    = new Dictionary<string, byte>
       {
           { "1.0", 0x00 },
           { "1.1", 0x01 },
           { "1.2", 0x02 },
           { "1.3", 0x03 }
        };

public static IReadOnlyDictionary<string, byte> ValidRevisions => _validRevisions;