2008-11-21 4 views
39

में स्ट्रक्चर के एक ऐरे को शुरू करना मैं यथासंभव स्पष्ट रूप से structs की एक स्थिर/स्थैतिक सरणी कैसे प्रारंभ कर सकता हूं?सी #

class SomeClass 
{ 

    struct MyStruct 
    { 
     public string label; 
     public int id; 
    }; 

    const MyStruct[] MyArray = { 
      {"a", 1} 
      {"b", 5} 
      {"q", 29} 
    }; 
}; 

उत्तर

46

सबसे पहले, आपको वास्तव में एक परिवर्तनशील struct है क्या ज़रूरत है? वे बुराई हैं। इसी तरह सार्वजनिक क्षेत्र। ReadOnlyCollection के उपयोग के बजाय सरणी ही उजागर की

class SomeClass 
{ 

    struct MyStruct 
    { 
     private readonly string label; 
     private readonly int id; 

     public MyStruct (string label, int id) 
     { 
      this.label = label; 
      this.id = id; 
     } 

     public string Label { get { return label; } } 
     public string Id { get { return id; } } 

    } 

    static readonly IList<MyStruct> MyArray = new ReadOnlyCollection<MyStruct> 
     (new[] { 
      new MyStruct ("a", 1), 
      new MyStruct ("b", 5), 
      new MyStruct ("q", 29) 
     }); 
} 

नोट - यह यह अपरिवर्तनीय, the problem exposing arrays directly से परहेज कर देगा:

उसके अलावा, मैं सिर्फ एक निर्माता डेटा के दो टुकड़े ले जा बनाएंगे। (कोड शो structs की एक सरणी शुरू करता है - यह केवल ReadOnlyCollection<> के निर्माता के संदर्भ को पास करता है।)

+2

@Chris है जैसे कि यह आरंभ: नहीं, मैं यह कहना चाहता हूँ कि यह अब तक सिर्फ सार्वजनिक रूप से उपभोज्य एपीआई परे चला जाता है। आपकी टीम कितनी बड़ी है? क्या आप हमेशा उस कंपनी के लिए काम करने जा रहे हैं? आप कितने निश्चित हैं कि * आपकी टीम * के हर सदस्य, अब और हमेशा के लिए, परिवर्तनीय structs की कई और विविध विषमता को समझता है? फेंकने वाले कोड के लिए, मैं सहमत हूं ... लेकिन अधिकांश कोड मूल रूप से अपेक्षाकृत रखरखाव मोड में अधिक समय तक रहता है, और खराब डिज़ाइन इसे बाद में विघटित करने में अधिक कठिन बना सकता है। आप पाते हैं कि किसी ने संदर्भ के आधार पर एक क्षेत्र पारित किया है और फिर आप * इसे तोड़ने के बिना गुणों को प्रतिबिंबित नहीं कर सकते हैं, आदि –

+0

बहुत बढ़िया जॉन, आपने मुझे आधुनिक ऑब्जेक्ट उन्मुख प्रोग्रामिंग का एक नया कोण महसूस किया है। धन्यवाद .. – Adarsha

+3

यह एक शर्म की बात है कि यहां बहुत अधिक टाइपिंग है। सी ++ 11 में मैं कर सकता हूं: 'संरचना foo {int i; कॉन्स चार * स्ट्र; चार सी; }; foo f [] = {{1, "हैलो", 'सी'}, {2, "अलविदा", 'डी' "}};' अगर कोई निर्माता को लिखने की आवश्यकता नहीं होती तो यह अच्छा होगा या "नया foo" टाइप करना होगा। – Bklyn

22

क्या आप सी # 3.0 का उपयोग कर रहे हैं? आप ऑब्जेक्ट प्रारंभकर्ताओं का उपयोग इस प्रकार कर सकते हैं:

static MyStruct[] myArray = 
      new MyStruct[]{ 
       new MyStruct() { id = 1, label = "1" }, 
       new MyStruct() { id = 2, label = "2" }, 
       new MyStruct() { id = 3, label = "3" } 
      }; 
+4

सी # 3 के साथ आपको प्रत्येक कन्स्ट्रक्टर कॉल (जैसे आप ऑब्जेक्ट प्रारंभकर्ता का उपयोग कर रहे हैं) के लिए() की आवश्यकता नहीं है और आप "नया MyStruct []" बिट को हटा सकते हैं जैसा कि सरणी के प्रारंभकर्ता होने के कारण किसी भी तरह से निहित है चर। –

+0

स्पष्ट होने के बावजूद, उपस्थिति और "नया" की कमी के बावजूद यह ढेर पर एक सरणी आवंटित करेगा, न कि ढेर पर। – yoyo

3

आप शून्य के अलावा डिफ़ॉल्ट रूप से संदर्भ प्रकार प्रारंभ नहीं कर सकते हैं। आपको उन्हें केवल पढ़ने के लिए है। तो यह काम कर सकता है;

readonly MyStruct[] MyArray = new MyStruct[]{ 
     new MyStruct{ label = "a", id = 1}, 
     new MyStruct{ label = "b", id = 5}, 
     new MyStruct{ label = "c", id = 1} 
    }; 
+5

ध्यान दें कि केवल वैरिएबल को केवल पाठ बनाता है - यह अन्य कोड को सरणी में तत्वों को बदलने से नहीं रोकता है। –

+1

यह समाधान मेरे लिए काम किया। यह एक शर्म की बात है कि हमारे पास पुराने सी-शैली सरणी/संरचना प्रारंभकर्ताओं के रूप में घना और कुशल नहीं है। –

-2

मैं कक्षा कि एक स्थिर केवल पढ़ने के लिए सरणी के मूल्य सेट पर एक स्थिर निर्माता का उपयोग करेंगे।

public class SomeClass 
{ 
    public readonly MyStruct[] myArray; 

    public static SomeClass() 
    { 
     myArray = { {"foo", "bar"}, 
        {"boo", "far"}}; 
    } 
} 
+0

स्थिर रचनाकारों के लिए एक एक्सेस संशोधक की अनुमति नहीं है –

0

बदलें static readonly करने के लिए const और इस

static readonly MyStruct[] MyArray = new[] { 
    new MyStruct { label = "a", id = 1 }, 
    new MyStruct { label = "b", id = 5 }, 
    new MyStruct { label = "q", id = 29 } 
};