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

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

当前回答

这是一种做你想做的事情的方法:

using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;

public ReadOnlyCollection<string> Titles { get { return new List<string> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();}}

它非常类似于做一个只读数组。

其他回答

从c# 6开始,你可以这样写:

public static string[] Titles => new string[] { "German", "Spanish", "Corrects", "Wrongs" };

参见:c#:新的和改进的c# 6.0(特别是“表达式体函数和属性”一章)

这将使一个只读的静态属性,但它仍然允许您更改返回的数组的内容,但当您再次调用该属性时,您将再次获得原始的、未更改的数组。

为了澄清,这段代码与(或实际上是缩写)相同:

public static string[] Titles
{
    get { return new string[] { "German", "Spanish", "Corrects", "Wrongs" }; }
}

请注意,这种方法有一个缺点:每个引用实际上都会实例化一个新数组,因此如果您使用的是一个非常大的数组,这可能不是最有效的解决方案。 但是如果你重复使用相同的数组(例如把它放在一个私有属性中),它将再次打开改变数组内容的可能性。

如果你想要一个不可变数组(或列表),你也可以使用:

public static IReadOnlyList<string> Titles { get; } = new string[] { "German", "Spanish", "Corrects", "Wrongs" };

但是,这仍然有更改的风险,因为你仍然可以将其转换回字符串[]并更改内容,如下所示:

((string[]) Titles)[1] = "French";

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

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

是的,但是你需要声明它为readonly而不是const:

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

原因是const只能应用于编译时已知值的字段。您所展示的数组初始化器不是c#中的常量表达式,因此会产生编译器错误。

声明它为readonly可以解决这个问题,因为值直到运行时才初始化(尽管可以保证在第一次使用数组之前已经初始化)。

根据你最终想要实现的目标,你也可以考虑声明一个枚举:

public enum Titles { German, Spanish, Corrects, Wrongs };

这是一种做你想做的事情的方法:

using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;

public ReadOnlyCollection<string> Titles { get { return new List<string> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();}}

它非常类似于做一个只读数组。

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

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

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