私は次のようなことをやろうとしています:
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.
この問題をどうすれば解決できますか?
ベストアンサー1
const
コンパイル時の定数です。できた単に にするだけstatic readonly
で、それは変数自体にのみ適用されますMETRICS
(通常は Metrics になりますが、.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>
、コレクション全体を不変と見なすことができます。
(ここでの大文字の使用は主に推測です。より完全な名前を使用すると、より明確になると思います。)
IList<string>
これを、IEnumerable<string>
、または他の何かとして宣言するかどうかはReadOnlyCollection<string>
あなた次第です... シーケンスとしてのみ扱われることを期待する場合、 がIEnumerable<string>
おそらく最も適切です。順序が重要であり、インデックスによってアクセスできるようにしたい場合は、 がIList<T>
適切かもしれません。不変性を明らかにしたい場合は、 として宣言するとReadOnlyCollection<T>
便利ですが、柔軟性がありません。