एक निरंतर सूची की इनलाइन तात्कालिकता


102

मैं ऐसा कुछ करने की कोशिश करता हूं:

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। प्रश्न संबंधित हैं, लेकिन न तो दूसरे का डुप्लिकेट है।
अथारी

जवाबों:


192

constसंकलन-समय स्थिरांक के लिए है। आप सकता है बस इसे बनाने static readonly, लेकिन यह केवल करने के लिए लागू होता है METRICS(द्वारा, जो आम तौर मेट्रिक्स के बजाय होना चाहिए चर ही नेट नामकरण रिवाजों का )। यह सूची को अपरिवर्तनीय नहीं बनाएगा - इसलिए कोई व्यक्ति कॉल कर सकता है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>आसान हो सकता है - लेकिन अनम्य।


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

-5

आप इस तरह एक सरल कोड की तलाश कर रहे हैं:

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

यह प्रश्न का उत्तर नहीं देता है क्योंकि किसी संपत्ति की तात्कालिकता प्रश्नकर्ता की आवश्यकता है।
वंचन जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.