内联常量列表的实例化

我尝试做这样的事情:

public const List<String> METRICS = new List<String>() { SourceFile.LOC, SourceFile.MCCABE, SourceFile.NOM, SourceFile.NOA, SourceFile.FANOUT, SourceFile.FANIN, SourceFile.NOPAR, SourceFile.NDC, SourceFile.CALLS }; 

但不幸的是这不起作用:

 FileStorer.METRICS' is of type 'System.Collections.Generic.List<string>'. A const field of a reference type other than string can only be initialized with null. 

我怎么解决这个问题?

const是编译时常量。 你可以使它成为static readonly ,但是这只适用于METRICSvariables本身(通常应该是通过.NET命名约定的度量)。 它不会使列表不可变 – 所以有人可以调用METRICS.Add("shouldn't be here");

您可能想要使用ReadOnlyCollection<T>来包装它。 例如:

 public static readonly IList<String> Metrics = new ReadOnlyCollection<string> (new List<String> { SourceFile.LoC, SourceFile.McCabe, SourceFile.NoM, SourceFile.NoA, SourceFile.FanOut, SourceFile.FanIn, SourceFile.Par, SourceFile.Ndc, SourceFile.Calls }); 

ReadOnlyCollection<T>只是封装了一个潜在的可变集合,但是因为没有别的东西可以访问List<T> ,所以可以把整个集合看作是不可变的。

(这里的大写大多是猜测 – 使用更全面的名字会使它们更清晰,海事组织。)

不pipe你声明为IList<string>IEnumerable<string>ReadOnlyCollection<string>还是别的什么都取决于你…如果你期望它只应该被当作一个序列,那么IEnumerable<string>可能是最合适的。 如果顺序很重要,而且你希望人们能够通过索引访问它, IList<T>可能是合适的。 如果要使不变性明显,则将其声明为ReadOnlyCollection<T>可能方便 – 但不灵活。

您将需要使用static readonly列表。 如果你想列表是不可变的,那么你可能要考虑使用ReadOnlyCollection<T>而不是List<T>

 private static readonly ReadOnlyCollection<string> _metrics = new ReadOnlyCollection<string>(new[] { SourceFile.LOC, SourceFile.MCCABE, SourceFile.NOM, SourceFile.NOA, SourceFile.FANOUT, SourceFile.FANIN, SourceFile.NOPAR, SourceFile.NDC, SourceFile.CALLS }); public static ReadOnlyCollection<string> Metrics { get { return _metrics; } }