是否可以写出类似于下面的内容?

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

当前回答

快速的解决方法,说不定对别人有帮助。我需要一个字符串[]作为Attribute的参数(在某些理论中为测试用例传递内联数据)。Readonly在这里没用。但是,我最后做的是:

const string foo = "a|b|c";

[InlineData(foo)]
public void Test(string fooString)
{
    var foo = fooString.Split("|"); // foo == {"a","b","c"}
    ...
}

其他回答

我相信你只能让它只读。

你不能创建一个“const”数组,因为数组是对象,只能是对象 在运行时创建,const实体在编译时解析。

你可以将数组声明为“readonly”。这是 与const的效果相同,只是该值可以在运行时设置。它只能是 设置一次,之后它就是一个只读(即const)值。

.NET Framework v4.5+解决方案,改进了tdbeckett的答案:

using System.Collections.ObjectModel;

// ...

public ReadOnlyCollection<string> Titles { get; } = new ReadOnlyCollection<string>(
  new string[] { "German", "Spanish", "Corrects", "Wrongs" }
);

注意:假定集合在概念上是常量,在类级别声明它时将其设置为静态可能是有意义的。

上面的:

Initializes the property's implicit backing field once with the array. Note that { get; } - i.e., declaring only a property getter - is what makes the property itself implicitly read-only (trying to combine readonly with { get; } is actually a syntax error). Alternatively, you could just omit the { get; } and add readonly to create a field instead of a property, as in the question, but exposing public data members as properties rather than fields is a good habit to form. Creates an array-like structure (allowing indexed access) that is truly and robustly read-only (conceptually constant, once created), both with respect to: preventing modification of the collection as a whole (such as by removing or adding elements, or by assigning a new collection to the variable). preventing modification of individual elements. (Even indirect modification isn't possible - unlike with an IReadOnlyList<T> solution, where a (string[]) cast can be used to gain write access to the elements, as shown in mjepsen's helpful answer. The same vulnerability applies to the IReadOnlyCollection<T> interface, which, despite the similarity in name to class ReadOnlyCollection, does not even support indexed access, making it fundamentally unsuitable for providing array-like access.)

你可以采用一种不同的方法:定义一个常量字符串来表示你的数组,然后在你需要它的时候把字符串分割成一个数组。

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引用。