อินไลน์อินไลน์ของรายการค่าคงที่


103

ฉันพยายามทำสิ่งนี้:

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

คำตอบ:


195

constใช้สำหรับค่าคงที่เวลาคอมไพล์ คุณสามารถสร้างได้static readonlyแต่จะใช้กับMETRICSตัวแปรเท่านั้น (ซึ่งโดยทั่วไปควรเป็นเมตริกแทนโดยหลักการตั้งชื่อ. NET ) มันจะไม่ทำให้รายการไม่เปลี่ยนรูป - มีคนโทรมาได้METRICS.Add("shouldn't be here");

คุณอาจต้องใช้ a 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>{ ... }ส่วน ขอบคุณจอน :)
เจสัน

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

-6

คุณกำลังมองหารหัสง่ายๆดังนี้:

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

สิ่งนี้ไม่ตอบคำถามเนื่องจากการสร้างอินสแตนซ์ของคุณสมบัติเป็นความต้องการของผู้ถาม
vchan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.