काफी नहीं। कक्षा या संरचना के रूप में एक प्रकार को डिजाइन करना इसे संग्रह में संग्रहीत करने की आपकी ज़रूरत से प्रेरित नहीं किया जाना चाहिए :) आपको
की समस्या को देखना चाहिए, जो समस्या आप देख रहे हैं वह मान प्रकार अर्थशास्त्र के कारण है। प्रत्येक मान प्रकार चर/संदर्भ एक नया उदाहरण है। जब आप
Struct obItem = MyList[1];
क्या होता है यह है कि संरचना का एक नया उदाहरण बनाया गया है और सभी सदस्यों को एक-एक करके कॉपी किया गया है। तो आपके पास MyList [1] यानी 2 उदाहरणों का क्लोन है। अब यदि आप obItem को संशोधित करते हैं, तो यह मूल को प्रभावित नहीं करता है।
obItem.Name = "Gishu"; // MyList[1].Name still remains "peter"
अब यहाँ 2 मिनट (यह नीचे घूंट कुछ समय लगता है के लिए मेरे साथ सहन .. यह मेरे लिए किया था :) तुम सच में एक संग्रह में संग्रहीत और संशोधित की तरह आप में संकेत दिया जा करने के लिए structs की जरूरत है अपने प्रश्न, आपको अपनी संरचना को एक इंटरफ़ेस का खुलासा करना होगा (हालांकि इसका परिणाम मुक्केबाजी) होगा। फिर आप इंटरफ़ेस संदर्भ के माध्यम से वास्तविक संरचना को संशोधित कर सकते हैं, जो बॉक्स किए गए ऑब्जेक्ट को संदर्भित करता है।
निम्न कोड स्निपेट दर्शाता क्या मैं सिर्फ ऊपर
public interface IMyStructModifier
{ String Name { set; } }
public struct MyStruct : IMyStructModifier ...
List<Object> obList = new List<object>();
obList.Add(new MyStruct("ABC"));
obList.Add(new MyStruct("DEF"));
MyStruct temp = (MyStruct)obList[1];
temp.Name = "Gishu";
foreach (MyStruct s in obList) // => "ABC", "DEF"
{ Console.WriteLine(s.Name); }
IMyStructModifier temp2 = obList[1] as IMyStructModifier;
temp2.Name = "Now Gishu";
foreach (MyStruct s in obList) // => "ABC", "Now Gishu"
{ Console.WriteLine(s.Name); }
HTH कहा। अच्छा प्रश्न।
अद्यतन: @ हैथ - आप मुझे यह जांचने के लिए दौड़ रहे थे कि मैंने कुछ आसान देखा है या नहीं। (अगर सेटर गुणों और विधियों ने किया तो यह असंगत होगा - नेट ब्रह्मांड अभी भी संतुलित है :)
सेटर विधि
obList2 [1] एक प्रतिलिपि देता है जिसका राज्य संशोधित किया जाएगा। सूची में मूल संरचना unmodified रहता है। तो सेट-थ्रू-इंटरफेस ऐसा करने का एकमात्र तरीका प्रतीत होता है।
List<MyStruct> obList2 = new List<MyStruct>();
obList2.Add(new MyStruct("ABC"));
obList2.Add(new MyStruct("DEF"));
obList2[1].SetName("WTH");
foreach (MyStruct s in obList2) // => "ABC", "DEF"
{
Console.WriteLine(s.Name);
}
यह पूरा जवाब नहीं है, गिशू का जवाब बहुत अधिक पूरा है। – Motti
जोलसन ने क्या कहा - यह इतना नहीं है कि structs "अपरिवर्तनीय" हैं। सही है। -1 cos यह कहना गलत है कि structs अपरिवर्तनीय हैं। – GuruC
एंड्रयू के लिए उचित होने के लिए - मैं यह नहीं समझता कि वह कह रहा है कि structs "अपरिवर्तनीय" हैं, वह कह रहे हैं कि उन्हें * अगर * वे अपरिवर्तनीय हैं; और निश्चित रूप से आप उन्हें अपरिवर्तनीय बना सकते हैं यदि सभी फ़ील्ड केवल पढ़े जाते हैं। – Montdidier