如何初始化ReadOnlyDictionary?

Tob*_*oby 13 c# dictionary c#-6.0

我有一个在课堂上暴露的不变的字典.

目前我的代码看起来像

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...
}
Run Code Online (Sandbox Code Playgroud)

我已经使用了支持字段,_validRevisions因为我无法找到创建共享常量字典属性的更好方法.是否有更简洁的方法来管理这个或者我应该让这个领域公开?

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

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

SO *_*ood 13

如果你不介意IReadOnlyDictionary代替a 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;
Run Code Online (Sandbox Code Playgroud)

  • 这将允许此类的用户将`ValidRevisions`强制转换回`Dictionary <string,byte>`并修改其内容.尽管如此,这并没有被提及作为约束. (13认同)
  • 该类的@CodeCaster用户可以使用反射来更改包含装饰字典实例的`ReadonlyDictionary`的私有只读字段.我总是想知道为什么将某些数据类型的接口视为客户端的合法行为 (4认同)

Tim*_*ter 8

ReadOnlyDictionary<TKey,?TValue>是就在一个正常的字典的包装,并且只有一个构造函数初始化它这需要另一个Dictionary实例.

所以,没有更短的方式.但我会使用静态构造函数初始化复杂的静态对象:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我是完全疯了还是有一些像"AsReadOnly"这样的扩展方法将Dictionary转换为readonly对应的? (5认同)
  • `public static ReadOnlyDictionary&lt;T, T2&gt; AsReadOnly&lt;T, T2&gt;(this Dictionary&lt;T, T2&gt; source) =&gt; new ReadOnlyDictionary&lt;T, T2&gt;(source);` ← 好了 (3认同)
  • @CamiloTerevinto您并不疯狂,但是`AsReadOnly`是集合的扩展,而不是字典的扩展,因此它将与列表或数组一起使用。 (2认同)
  • 这同样取决于“T2”实际上是什么,运行时将遵守您告诉它的内容,即使这有点矛盾。例如,“ReadOnlyDictionary&lt;string, List&lt;byte&gt;&gt;”仍将公开一个可变列表作为每个“Key”的“Value”。实际上,如果您在内部构建这样的字典并且只想将其公开为只读,那么您必须将每个“Value”重新实现为其自己的“IEnumerable” (2认同)