【问题标题】:How to properly use IReadOnlyDictionary?如何正确使用 IReadOnlyDictionary?
【发布时间】:2015-12-10 04:59:25
【问题描述】:

来自msdn

表示键/值对的通用只读集合。

但请考虑以下几点:

class Test
{
    public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string>
    {
        { "1", "111" },
        { "2", "222" },
        { "3", "333" },
    };

    public IReadOnlyList<string> List { get; } =
        (new List<string> { "1", "2", "3" }).AsReadOnly();
}

class Program
{
    static void Main(string[] args)
    {
        var test = new Test();

        var dictionary = (Dictionary<string, string>)test.Dictionary; // possible
        dictionary.Add("4", "444"); // possible
        dictionary.Remove("3"); // possible

        var list = (List<string>)test.List; // impossible
        list.Add("4"); // impossible
        list.RemoveAt(0); // impossible
    }
}

我可以轻松地将IReadOnlyDictionary 转换为Dictionary(任何人都可以)并更改它,而List 有很好的AsReadOnly 方法。

问题:如何正确使用IReadOnlyDictionary公开确实只读字典?

【问题讨论】:

  • 我认为在Dictionary 上创建一个Adapter 有助于只公开只读 行为。
  • 您误解了接口的作用。它只是描述了一份合同。例如,IList&lt;T&gt; 可以继承 IReadOnlyCollection&lt;T&gt;,但这不会使实现 List&lt;T&gt; 的列表成为只读的。您的实际问题是“如何制作只读字典”
  • @CodeCaster,嗯,是的。但不是自己制作,而是正确重用.net类型中的现有内容。
  • @adricadar,我正在使用属性。

标签: c# dictionary readonly-collection


【解决方案1】:

.NET 4.5 引入了您可以使用的 ReadOnlyDictionary 类型。它有一个接受现有字典的构造函数。

针对较低的框架版本时,请使用 Is there a read-only generic dictionary available in .NET?Does C# have a way of giving me an immutable Dictionary? 中所述的包装器。

请注意,当使用后一个类时,集合初始化语法将不起作用;编译为 Add() 调用。

【讨论】:

  • 没有注意到ReadOnlyDictionary(它隐藏得很好),谢谢。我可以使用普通的Dictionary 和集合初始化器作为ReadOnlyDictionary 的构造函数参数。
  • 如果您使用的是最新版本的 .Net,也可以使用 ImmutableDictionary&lt;&gt;。 (这是一个核心的不可变类;)
  • @MatthewWatson,很高兴知道,谢谢。我想知道有什么区别,但那将是另一个问题,对吧?
  • @Sinatr ImmutableDictionary&lt;&gt; 不是包装类,它是真正不可变的。 ReadOnlyDictionary 只是一个包装器,重要的是要注意,如果您更改包装字典的内容,只读字典的内容也会更改。它是只读的,不是一成不变的!
  • @MatthewWatson,感谢您的解释。创建实例后我不会更改字典内容(不存储可写字典实例,ReadOnlyDictionary.Dictionary 属性是protected),所以我只需要只读ToBuilder() / ToImmutable() 的想法很好(多线程?),可能有一天会使用 ImmutableDictionary
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2012-07-12
  • 2013-01-21
  • 2021-10-24
  • 2011-12-22
相关资源
最近更新 更多