C# 如何初始化ReadOnlyDictionary?
我有一本在课堂上公开的不变的词典 目前我的代码看起来像C# 如何初始化ReadOnlyDictionary?,c#,dictionary,c#-6.0,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&g
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...
}
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
公开课
{
私有静态只读字典
=新的只读字典(
新字典(){
{“1.0”,0x00},
{“1.1”,0x01},
{“1.2”,0x02},
{“1.3”,0x03}
} );
public static ReadOnlyDictionary ValidRevisions=>\u ValidRevisions;
//其他课程内容。。。
}
我使用了backing字段\u validRevisions
,因为我无法找到更好的方法来创建共享常量字典属性。有没有更整洁的方法来处理这个问题,或者我应该把这个领域公之于众
我的主要问题是是否有一种较短的方法来初始化\u validRevisions
字段本身?创建一个内联字典并将其传递到一个字典(恰好是只读的)似乎有点。。。一种代码的气味。它是?有更好的办法吗
编辑:关于棒的另一件事我刚刚注意到,没有方法支持检查它是否包含给定值。。。有什么原因与它的“只读性”有关吗?它只是普通字典的包装,只有一个可以初始化它,而另一个字典
实例需要初始化它
因此,没有捷径了。但我会使用初始化复杂的静态对象:
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);
}
private static ReadOnlyDictionary\u validRevisions;
静态类()
{
IDictionary dict=新字典(){
{“1.0”,0x00},
{“1.1”,0x01},
{“1.2”,0x02},
{“1.3”,0x03}
};
_validRevisions=新的只读词典(dict);
}
如果您不介意使用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;
私有静态IReadOnlyDictionary\u有效
=新词典
{
{“1.0”,0x00},
{“1.1”,0x01},
{“1.2”,0x02},
{“1.3”,0x03}
};
公共静态IReadOnlyDictionary ValidReservisions=>\u ValidReservisions;
您标记了C#4,但使用了C#6功能(=>运算符),您使用的是哪一个?@CamiloTerevinto哇,不知道是C#6!Will change Now Dictionary实现了IReadOnlyDictionary,因此您的_validRevisions可以是Dictionary的实例,而validRevisions只能公开IReadOnlyDictionary部分。@Ivan这将允许用户强制转换和修改它。问题中未提及约束。请注意,您可以使用自动实现的属性:public static ReadOnlyDictionary ValidRevisions{get;}=new…
,这将允许此类用户将ValidRevisions
转换回字典并修改其内容。不过,这并不是问题中提到的约束。@CodeCaster只是制作了一个控制台来尝试一下,你是对的。没想到会这样possible@Toby是的,我的示例使它是可变的,因此它不适合您的应用程序case@CodeCaster此类的用户可以使用反射更改保存修饰字典实例的ReadonlyDictionary
的私有只读字段。我总是想知道为什么将接口转换为某些数据类型被认为是client@Sergey呵呵,那是真的。我是完全疯了还是有什么扩展方法,比如“AsReadOnly”,把字典转换成了只读版本?@camiloteriento你不是疯了,但是,AsReadOnly
是集合的扩展,而不是字典的扩展,因此它可以处理列表或数组。public static ReadOnlyDictionary AsReadOnly(此字典源)=>new ReadOnlyDictionary(源代码)代码>← 这同样取决于T2
实际上是什么,运行时将遵守您告诉它的内容,即使这有点矛盾。例如,ReadOnlyDictionary
仍将为每个键
公开一个可变列表作为值
。实际上,如果您在内部构建这样一个字典,并且只想将其公开为只读,那么您必须将每个值
重新实现为它自己的IEnumerable