如何在C++中得到等价的C++的”const”?


How can I get the equivalent of C++'s “const” in C#?

本问题已经有最佳答案,请猛点这里访问。

在C++中,如果我希望一个对象在编译时被初始化,此后就永远不会更改,我只需添加前缀EDCOX1(0)就可以了。

在C语言中,我写

1
2
3
4
5
    // file extensions of interest
    private const List<string> _ExtensionsOfInterest = new List<string>()
    {
       ".doc",".docx",".pdf",".png",".jpg"
    };

然后得到错误

A const field of a reference type other than string can only be
initialized with null

然后研究了栈溢出的误差,提出了采用ReadOnlyCollection的解决方案。引用类型(字符串除外)的常量字段只能用空错误初始化

但这并不能让我有我想要的行为,因为

1
2
3
4
5
    // file extensions of interest
    private static ReadOnlyCollection<string> _ExtensionsOfInterest = new ReadOnlyCollection<string>()
    {
       ".doc",".docx",".pdf",".png",".jpg"
    };

仍可以重新分配。

那么我该怎么做我想做的呢?

(令人惊讶的是,除了我想要的以外,C的所有语言功能都是不可测量的)


您要使用readonly修饰符

1
2
3
4
private readonly static ReadOnlyCollection<string> _ExtensionsOfInterest = new ReadOnlyCollection<string>()
{
   ".doc",".docx",".pdf",".png",".jpg"
};

编辑

刚刚注意到readOnlyCollection类型不允许空构造函数或在括号中提供列表。必须在构造函数中提供列表。

所以你真的可以把它写成一个普通的只读列表。

1
2
3
4
private readonly static List<string> _ExtensionsOfInterestList = new List<string>()
{
   ".doc",".docx",".pdf",".png",".jpg"
};

或者,如果您真的想使用readOnlyCollection,您需要在构造函数中提供高于正常值的列表。

1
private readonly static ReadOnlyCollection<string> _ExtensionsOfInterest = new ReadOnlyCollection<string>(_ExtensionsOfInterestList);