定数リストのインラインインスタンス化 質問する

定数リストのインラインインスタンス化 質問する

私は次のようなことをやろうとしています:

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>便利ですが、柔軟性がありません。

おすすめ記事