是否可以写出类似于下面的内容?
public const string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
是否可以写出类似于下面的内容?
public const string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
当前回答
为了完整起见,现在我们也有immutablearray供我们使用。这应该是真正不可变的:
public readonly static ImmutableArray<string> Titles =
ImmutableArray.Create(new[] { "German", "Spanish", "Corrects", "Wrongs" });
需要System.Collections.Immutable NuGet引用。
其他回答
你可以采用一种不同的方法:定义一个常量字符串来表示你的数组,然后在你需要它的时候把字符串分割成一个数组。
const string DefaultDistances = "5,10,15,20,25,30,40,50";
public static readonly string[] distances = DefaultDistances.Split(',');
这种方法为您提供了一个可以存储在配置中并在需要时转换为数组的常量。
最好的选择:
public static readonly byte[] ZeroHash = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
从c# 6开始,你可以这样写:
public static string[] Titles => new string[] { "German", "Spanish", "Corrects", "Wrongs" };
参见:c#:新的和改进的c# 6.0(特别是“表达式体函数和属性”一章)
这将使一个只读的静态属性,但它仍然允许您更改返回的数组的内容,但当您再次调用该属性时,您将再次获得原始的、未更改的数组。
为了澄清,这段代码与(或实际上是缩写)相同:
public static string[] Titles
{
get { return new string[] { "German", "Spanish", "Corrects", "Wrongs" }; }
}
请注意,这种方法有一个缺点:每个引用实际上都会实例化一个新数组,因此如果您使用的是一个非常大的数组,这可能不是最有效的解决方案。 但是如果你重复使用相同的数组(例如把它放在一个私有属性中),它将再次打开改变数组内容的可能性。
如果你想要一个不可变数组(或列表),你也可以使用:
public static IReadOnlyList<string> Titles { get; } = new string[] { "German", "Spanish", "Corrects", "Wrongs" };
但是,这仍然有更改的风险,因为你仍然可以将其转换回字符串[]并更改内容,如下所示:
((string[]) Titles)[1] = "French";
可以将数组声明为只读数组,但请记住,可以更改只读数组的元素。
public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
...
Titles[0] = "bla";
可以考虑像Cody建议的那样使用enum或IList。
public readonly IList<string> ITitles = new List<string> {"German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();
你不能创建一个“const”数组,因为数组是对象,只能是对象 在运行时创建,const实体在编译时解析。
你可以将数组声明为“readonly”。这是 与const的效果相同,只是该值可以在运行时设置。它只能是 设置一次,之后它就是一个只读(即const)值。