c# - 如何构建只读字典?

标签 c# initialization constants

因此,我正在设计一个全局常量,它将保存程序不同字符的数据。我认为System.Collections.Generic.Dictionary是我的数据类型,因为它允许按字符进行非常快速的搜索。声明如下所示:

public static readonly Dictionary<char, LetterImage> letters;

( LetterImage 是一个自定义结构。它的内容并不重要。)

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

最佳答案

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

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

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

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

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

关于c# - 如何构建只读字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49009940/

相关文章:

swift - 如何满足包含初始值设定项的协议(protocol)?

c - 有没有办法在 C 中将数字范围定义为常量?

c# - Windows Kinect SDK + OpenNI Primesense

c# - 标记类的接口(interface)或属性?

c++ - C++中何时使用which数据成员初始化

c++ - C++ 中初始化的结果是什么?

c# - 在 Microsoft IIS 服务器上部署 ASP.NET MVC 应用程序失败

c# - 如何解决 Windows Phone 应用程序中的内存问题

c# - 为什么 const mytype _var = new mytype() 不起作用?

c# - 关于 C# 中常量小数字段的令人困惑的警告