Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何初始化ReadOnlyDictionary?_C#_Dictionary_C# 6.0 - Fatal编程技术网

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