定数リストのインラインインスタンス化


101

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

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.

この問題を解決するにはどうすればよいですか?



4
注:この質問を重複として閉じるのは誤りでした。リンクされた質問は定数配列に関するものであり、この質問は定数リストに関するものです。どちらのアプローチもほぼ同じ機能を提供しますが、それらは異なり、答えも異なります。この質問への回答のみ言及ReadOnlyCollection。質問は関連していますが、どちらも重複しています。
Athari、2014年

回答:


191

constコンパイル時の定数用です。あなたそれを作ることもできstatic readonlyますが、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>その後は他にアクセスできないため、コレクション全体を不変と見なすことができます。

(ここでの大文字の使用はほとんど推測です-完全な名前を使用すると、IMOでわかりやすくなります。)

あなたのようにそれを宣言するかどうかIList<string>IEnumerable<string>ReadOnlyCollection<string>あなたはそれが唯一のシーケンスとして扱われるべきであると予想される場合や何か他のものは、あなた次第です...、そしてIEnumerable<string>おそらく最も適切であろう。順序が重要で、インデックスでアクセスできるようにしたい場合は、IList<T>適切な場合があります。不変性を明らかにしたい場合ReadOnlyCollection<T>は、便利であると宣言しますが、柔軟性がありません。


2
new List<string>{ ... }パーツを探してここに来ました。ありがとうJon :)
Jason

1
理由はあると思いますが、私がそれを公​​開するようにReadOnlyCollection実装するのは奇妙ですIList<>.Add
AaronLS

25

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; }
}

-5

次のような簡単なコードを探しています。

    List<string> tagList = new List<string>(new[]
    {
         "A"
        ,"B"
        ,"C"
        ,"D"
        ,"E"
    });

プロパティのインスタンス化は質問者の必要であるため、これは質問に答えません。
vchan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.