在C#中,您可以定义const string
,但不能定义数组,因为数组是objects
。据我所知,字符串实际上是 object
,因为它们是像数组一样通过值传递的引用对象。
那么我们怎么做呢:
const string NewLine = "\r\n";
但不是这样:
const byte[] AesSwapBytes = new byte[] { ... };
是因为我们无法更改字符串(NewLine[0] = '\n'
)上的单个字符,但可以更改数组(arr[0] = i
)吗?
答案 0 :(得分:2)
是否可以创建变量与它是对象还是结构无关。创建变量const
所需要的是赋值的右手大小必须是编译时文字。只有少数类型具有编译时文字。 string
与int
,double
以及其他数字类型相同。正如在另一个答案中提到的,null
是一个编译时文字,所以如果你真的想要,你可以将任何可以为空的类型指定为const
并为其指定null(不是它真的有用) )。如果C#要添加导致数组的编译时文字(除了null),那么你可以创建一个有意义的const
数组。在那之前,你会被困在使用其他一些机制来做你想做的事。
答案 1 :(得分:1)
According to this MSDN post,可以在C#中定义readonly
数组。 C#特别不允许您将数组声明为constant
,因为赋值表达式不是常量。
public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
然而,第一条评论详细说明,无论如何这都是无用的,因为
您无法重新分配数组,但可以替换单个值。
答案 2 :(得分:1)
事实上,只要初始化程序是编译时常量,就可以使用const
关键字声明一个数组常量。
const byte[] Nothing = null;
作为一般规则,对于引用类型,只有null
是编译时常量。
.NET特殊例外也允许字符串文字。
答案 3 :(得分:1)
声明为readonly
的数组的问题在于,即使该字段是只读的(您无法使其引用另一个数组),也可以更改数组本身的内容。
如果您需要一个无法更改内容的“不可变数组”,答案是:不使用数组。 数组是可变的,你无能为力。
可能的解决方法是使用只读集合:
static readonly IList<byte> AesSwapBytes =
new ReadOnlyCollection<byte>(new byte[] { ... });
如果您需要将其用作数组,只需在其上调用ToArray
扩展方法即可。它将返回一个包含数据副本的数组,而不是原始数组;因此,如果您修改ToArray
的结果,则不会影响原始集合。