Sabit bir Listenin satır içi somutlaştırılması


103

Bunun gibi bir şey yapmaya çalışıyorum:

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

Ama maalesef bu işe yaramıyor:

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.

Bu sorunu nasıl çözebilirim?



4
NOT: Bu soruyu kopya olarak kapatmak bir hataydı. Bağlantılı soru sabit diziler hakkındadır , bu soru sabit listeler hakkındadır . Her iki yaklaşım da aşağı yukarı aynı işlevselliği sağlasa da, farklıdırlar ve cevaplar farklıdır. Sadece bu soruya verilen cevaplardan bahsediliyor ReadOnlyCollection. Sorular birbiriyle ilgilidir, ancak ikisi de birbirinin aynısı değildir.
Athari

Yanıtlar:


195

constderleme zamanı sabitleri içindir. Sen olabilir sadece bunu yapmak static readonly, ama bu sadece için de geçerli olacak METRICS(tarafından, tipik yerine Metrik olmalıdır değişken kendisi .NET adlandırma kurallarına ). Listeyi değiştirilemez yapmaz - böylece birisi arayabilirMETRICS.Add("shouldn't be here");

Sarmak için bir kullanmak isteyebilirsiniz ReadOnlyCollection<T>. Örneğin:

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>sadece potansiyel olarak değiştirilebilir bir koleksiyonu sarar, ancak List<T>daha sonra başka hiçbir şey erişemeyeceğinden , genel koleksiyonun değişmez olduğunu düşünebilirsiniz.

(Buradaki büyük harf kullanımı çoğunlukla varsayımdır - daha tam adlar kullanmak onları daha açık hale getirir, IMO.)

Eğer olarak ilan İster IList<string>, IEnumerable<string>, ReadOnlyCollection<string>daha sonra, sadece bir dizi olarak ele alınması gerektiğini bekliyorsanız veya başka bir şey ... size kalmış IEnumerable<string>muhtemelen en uygun olacaktır. Sipariş önemliyse ve insanların dizine göre erişebilmelerini istiyorsanız, IList<T>uygun olabilir. Değişmezliği görünür kılmak istiyorsanız, ReadOnlyCollection<T>kullanışlı olabileceğini ama esnek olmadığını beyan edin .


2
Buraya new List<string>{ ... }kısmı aramaya geldim . Teşekkürler Jon :)
Jason

1
Ben bir sebebi var herhalde, ama bana tuhaf olduğunu ReadOnlyCollectionuygular IList<>anlaşılmaktadır olarak.Add
AaronLS

25

Bunun static readonlyyerine bir liste kullanmanız gerekecek . Ve listenin değişmez olmasını istiyorsanız, kullanmak ReadOnlyCollection<T>yerine kullanmayı düşünebilirsiniz 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; }
}

-6

Bunun gibi basit bir kod arıyorsunuz:

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

Bir özelliğin somutlaştırılması sorgulayan kişinin ihtiyacı olduğu için bu soruya cevap vermez.
vchan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.