सबसे पहले, आपको वास्तव में एक परिवर्तनशील 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<>
के निर्माता के संदर्भ को पास करता है।)
स्रोत
2008-11-21 17:18:47
@Chris है जैसे कि यह आरंभ: नहीं, मैं यह कहना चाहता हूँ कि यह अब तक सिर्फ सार्वजनिक रूप से उपभोज्य एपीआई परे चला जाता है। आपकी टीम कितनी बड़ी है? क्या आप हमेशा उस कंपनी के लिए काम करने जा रहे हैं? आप कितने निश्चित हैं कि * आपकी टीम * के हर सदस्य, अब और हमेशा के लिए, परिवर्तनीय structs की कई और विविध विषमता को समझता है? फेंकने वाले कोड के लिए, मैं सहमत हूं ... लेकिन अधिकांश कोड मूल रूप से अपेक्षाकृत रखरखाव मोड में अधिक समय तक रहता है, और खराब डिज़ाइन इसे बाद में विघटित करने में अधिक कठिन बना सकता है। आप पाते हैं कि किसी ने संदर्भ के आधार पर एक क्षेत्र पारित किया है और फिर आप * इसे तोड़ने के बिना गुणों को प्रतिबिंबित नहीं कर सकते हैं, आदि –
बहुत बढ़िया जॉन, आपने मुझे आधुनिक ऑब्जेक्ट उन्मुख प्रोग्रामिंग का एक नया कोण महसूस किया है। धन्यवाद .. – Adarsha
यह एक शर्म की बात है कि यहां बहुत अधिक टाइपिंग है। सी ++ 11 में मैं कर सकता हूं: 'संरचना foo {int i; कॉन्स चार * स्ट्र; चार सी; }; foo f [] = {{1, "हैलो", 'सी'}, {2, "अलविदा", 'डी' "}};' अगर कोई निर्माता को लिखने की आवश्यकता नहीं होती तो यह अच्छा होगा या "नया foo" टाइप करना होगा। – Bklyn