我们如何定义字符串常量而不是数组

时间:2012-08-19 03:39:43

标签: c# arrays string constants immutability

在C#中,您可以定义const string,但不能定义数组,因为数组是objects。据我所知,字符串实际上是 object,因为它们是像数组一样通过值传递的引用对象。

那么我们怎么做呢:

const string NewLine = "\r\n";

但不是这样:

const byte[] AesSwapBytes = new byte[] { ... };

是因为我们无法更改字符串(NewLine[0] = '\n')上的单个字符,但可以更改数组(arr[0] = i)吗?

4 个答案:

答案 0 :(得分:2)

是否可以创建变量与它是对象还是结构无关。创建变量const所需要的是赋值的右手大小必须是编译时文字。只有少数类型具有编译时文字。 stringintdouble以及其他数字类型相同。正如在另一个答案中提到的,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" };

然而,第一条评论详细说明,无论如何这都是无用的,因为

  

您无法重新分配数组,但可以替换单个值。

More information on Stack Overflow here

答案 2 :(得分:1)

事实上,只要初始化程序是编译时常量,就可以使用const关键字声明一个数组常量。

const byte[] Nothing = null;

作为一般规则,对于引用类型,只有null是编译时常量。

.NET特殊例外也允许字符串文字。

答案 3 :(得分:1)

声明为readonly的数组的问题在于,即使该字段是只读的(您无法使其引用另一个数组),也可以更改数组本身的内容。

如果您需要一个无法更改内容的“不可变数组”,答案是:不使用数组数组是可变的,你无能为力。

可能的解决方法是使用只读集合:

static readonly IList<byte> AesSwapBytes =
    new ReadOnlyCollection<byte>(new byte[] { ... });

如果您需要将其用作数组,只需在其上调用ToArray扩展方法即可。它将返回一个包含数据副本的数组,而不是原始数组;因此,如果您修改ToArray的结果,则不会影响原始集合。