2017-05-30 82 views
1

我有一个不变的字典暴露在课堂上。如何初始化ReadOnlyDictionary?

目前我的代码看起来像

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,因为我无法弄清楚创建一个共享定字典属性,更好的办法。有没有更好的方法来管理这个问题,或者我应该让这个领域公开?

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

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

+1

您标记了C#4,但使用了C#6功能(=>运算符),您使用哪一个? –

+0

@CamiloTerevinto呃,不知道是C#6!现在将改变 – Toby

+0

字典实现IReadOnlyDictionary 所以你的_validRevisions可以是Dictionary的一个实例,而ValidRevisions只能暴露IReadOnlyDictionary部分。 –

回答

6

如果你不介意的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; 
+3

这将允许此类的用户将'ValidRevisions'强制转换回'Dictionary '并修改其内容。尽管这在问题中没有被提及为约束条件。 – CodeCaster

+0

@CodeCaster只是做了一个控制台来试用它,你是对的。没想到这是可能的 –

+0

@CodeCaster,如上面评论中提到的那样,我确实希望这是不可改变的(这与你所说的不一样吗?) – Toby

4

ReadOnlyDictionary<TKey, TValue>只是一个普通字典的包装,只有一个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); 
} 
+0

我完全疯了吗,还是有一些像“AsReadOnly”这样的扩展方法,将字典转换为只读对应? –

+0

@CamiloTerevinto你不是疯了,但'AsReadOnly'是集合的扩展,而不是字典,所以它将与列表或数组一起工作。 – VMAtm