C# 如何正确使用iRadonlyDictionary?

C# 如何正确使用iRadonlyDictionary?,c#,dictionary,readonly-collection,C#,Dictionary,Readonly Collection,发件人: 表示键/值对的通用只读集合 但考虑如下: class Test { public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string> { { "1", "111" }, { "2", "222" }, { "3", "333" }, }; public IR

发件人:

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

但考虑如下:

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{get;}=新字典
{
{ "1", "111" },
{ "2", "222" },
{ "3", "333" },
};
公共IReadOnlyList列表{get;}=
(新列表{“1”、“2”、“3”}).AsReadOnly();
}
班级计划
{
静态void Main(字符串[]参数)
{
var测试=新测试();
var dictionary=(dictionary)test.dictionary;//可能
dictionary.Add(“4”,“444”);//可能
dictionary.Remove(“3”);//可能
var list=(list)test.list;//不可能
list.Add(“4”);//不可能
list.RemoveAt(0);//不可能
}
}
我可以轻松地将
IReadOnlyDictionary
转换为
字典
(任何人都可以)并对其进行更改,而
List
具有nice
AsReadOnly
方法

问题:如何正确使用
IReadOnlyDictionary
公开真正的只读词典?

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

针对较低的框架版本时,请按照和中的说明使用包装器


请注意,当使用后一个类时,集合初始值设定项语法将不起作用;这会被编译成
Add()
调用。

我认为在
字典上创建适配器有助于只公开只读行为。你误解了接口的作用。它只是描述一个合同<例如,code>IList
可以继承
IReadOnlyCollection
,但这不会使实现
list
的列表成为只读的。你真正的问题是“如何制作只读词典”@CodeCaster,嗯,是的。但不是我自己做的,而是正确地重用.net类型中的现有内容。@adricadar,我正在使用属性。没有注意到
ReadOnlyDictionary
(它隐藏得很好),谢谢。我可以使用普通的
字典
和集合初始值设定项作为
ReadOnlyDictionary
的构造函数参数。如果您使用的是最新版本的.Net,也可以使用。(这是一个核心的不可变类;)@MatthewWatson,很高兴知道,谢谢。我想知道有什么不同,但那将是另一个问题,对吗?@Sinatr
ImmutableDictionary
不是包装类,它确实是不可变的
ReadOnlyDictionary
只是一个包装器,需要注意的是,如果更改包装字典的内容,只读字典的内容也会更改。它是只读的,不是一成不变的@马修沃森,谢谢你的解释。创建实例后,我不会更改字典内容(可写字典实例未存储且
ReadOnlyDictionary.dictionary
属性受
保护),因此只读是我所需要的。使用
ToBuilder()/ToImmutable()
的想法很好(多线程?),将来可能会使用
ImmutableDictionary