3

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

那么我们如何做到这一点:

const string NewLine = "\r\n";

但不是这个:

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

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

4

4 回答 4

2

能不能做变量与它是对象还是结构体无关。创建变量所需的const是赋值的右手大小必须是编译时文字。只有少数类型具有编译时文字。 string是一个,就像int,double和其他数字类型一样。正如另一个答案中提到的,null是编译时文字,所以如果你真的想要你可以分配任何可为空的类型const并为其分配 null (并不是说它真的很有用)。如果 C# 要添加导致数组的编译时文字(除了 null),那么您可以创建一个有意义的const数组。在那之前,你会被困在使用其他一些机制来做你想做的事情。

于 2012-08-19T05:27:01.263 回答
1

根据this MSDN post,可以在C#中定义一个readonly数组。C# 特别不允许您将数组声明为,constant因为赋值表达式不是常量。

public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };

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

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

有关堆栈溢出的更多信息,请点击此处

于 2012-08-19T03:45:15.090 回答
1

const实际上,只要初始化器是编译时常量,您就可以使用关键字声明数组常量。

const byte[] Nothing = null;

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

.NET 做了一个特殊的例外,也允许字符串文字。

于 2012-08-19T03:48:37.997 回答
1

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

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

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

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

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

于 2012-08-19T03:58:47.693 回答