内联常量列表的实例化
我尝试做这样的事情:
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
,但是这只适用于METRICS
variables本身(通常应该是通过.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; } }