是否可以写出类似于下面的内容?
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引用。
其他回答
可以将数组声明为只读数组,但请记住,可以更改只读数组的元素。
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 string DefaultDistances = "5,10,15,20,25,30,40,50";
public static readonly string[] distances = DefaultDistances.Split(',');
这种方法为您提供了一个可以存储在配置中并在需要时转换为数组的常量。
为了完整起见,现在我们也有immutablearray供我们使用。这应该是真正不可变的:
public readonly static ImmutableArray<string> Titles =
ImmutableArray.Create(new[] { "German", "Spanish", "Corrects", "Wrongs" });
需要System.Collections.Immutable NuGet引用。
如果你在IReadOnlyList接口后面声明了一个数组,你会得到一个常量数组,在运行时声明常量值:
public readonly IReadOnlyList<string> Titles = new [] {"German", "Spanish", "Corrects", "Wrongs" };
在. net 4.5及更高版本中可用。
这是唯一正确的答案。目前还不能这样做。
所有其他答案都建议使用静态只读变量,类似于常量,但不相同。常量被硬编码到程序集中。静态只读变量只能设置一次,可能是在初始化对象时。
这些有时是可以互换的,但并非总是如此。
编辑:我想我应该把这个扔进来,因为似乎问这个问题的人对数组有点模糊。声明数组时,它是指向包含该数组的内存段的指针。它非常简单,因为它只是一个地址,没有复杂的逻辑控制它是否可读或可写。它给你一个指针,你可以用它做任何你想做的事情。
这就是为什么创建一个不可变数组有点棘手的部分原因。你可以写一个包装数组的类并且只允许通过返回一个副本来读取它,但这样它就不再只是一个数组了,它是一个包装数组的对象。
有些人建议使用static或readonly来模拟创建const数组时看到的行为。这些药物有一些副作用,对普通读者来说可能不太明显。同样,如果你用readonly标记一个数组,你是在标记指向数组的指针,而不是数组本身。你可以随心所欲地改变数组的内容:
public class Demo
{
private readonly int[] _foo = new int[] {0,1,2,3};
public void ChangeArray()
{
_foo[1] = 42; // works
_foo = new int[] { 0, 1, 2, 3, 5 }; // won't even compile
}
}
要真正获得const数组,需要对c#和MSIL底层代码进行更新,以允许从数组中读取,但不允许写入。本页上的其他建议是解决这个问题的各种创造性方法。