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