如何构造只读字典?

duk*_*ukc 2 c# initialization constants

因此,我正在设计一个全局常量,该常量将保存程序中不同字符的数据。我认为这System.Collections.Generic.Dictionary是我的数据类型,因为它允许按字符快速搜索。声明看起来像这样:

public static readonly Dictionary<char, LetterImage> letters;
Run Code Online (Sandbox Code Playgroud)

LetterImage作为自定义结构。它的内容并不重要。)

问题?如何定义的元素Dictionary?我不能仅仅letters.Add('a', new LetterImage{...})因为字典是readonly,因为我不需要全局变量。我需要一种用文字初始化它的方法。

Tit*_*mir 5

您可以使用适当的集合来确保字典真正是只读的,即ReadOnlyDictionary。您可以内联初始化

public static readonly ReadOnlyDictionary<char, LetterImage> dictionary = new ReadOnlyDictionary<string, string>(new Dictionary<char, LetterImage>
{
    ['a'] = new LetterImage()
});
Run Code Online (Sandbox Code Playgroud)

如果您有更复杂的代码来初始化字典,则也可以使用静态构造函数(可以在静态构造函数中分配只读字段)

class Program
{
    public static readonly ReadOnlyDictionary<char, LetterImage> dictionary;
    static Program()
    {
        var mutable = new Dictionary<char, LetterImage>();
        // Initalize
        dictionary = new ReadOnlyDictionary<char, LetterImage>(mutable)
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意readonly修饰符不会影响字段中存储的对象的可变性。如果将普通词典存储在只读字段中,则仍然可以对词典进行突变,只需修改该字段即可。