2017-12-07 16 views
5

की सूची और ऐरे मैं सूची और Arrays का उपयोग करते समय सी # structs संचालित करने के तरीके के बारे में मेरी समझ को समझने/समझने की कोशिश कर रहा हूं। मैं इस पोस्ट में एरिक की व्याख्या का पालन करता हूं Performance of array of struct typesstructs वैल्यू बनाम वैरिएबल

लेकिन मैं इसे एक कदम आगे ले रहा हूं।

struct Foo { public int A; public int B; public Foo[] ChildFoos; } 

Foo parentFoo = new Foo(); 
parentFoo.ChildFoos = new Foo[1]; 
parentFoo.ChildFoos[0] = new Foo(); 

List<Foo> list = new List<Foo>(); 
list.Add(parentFoo); 

लेकिन जब आप कॉल को चेन करते हैं तो व्यवहार बदल जाता है। सूची [0] एक मान वापस करनी चाहिए (एक चर नहीं) जहां चाइल्डफूज़ [0] एक चर वापस लौटना चाहिए।

list[0].ChildFoos[0].A = 4545; 

इस मामले में क्या होता प्रतीत होता है सूची [0] को मूल्य के बजाय एक चर के रूप में माना जा रहा है। चाइल्डफूज़ [0]। सूची में माता-पिता में यह नया मान रखता है। यह कैसे संभव है?

पेरेंट फू स्ट्रक्चर पर ए सेट करने का प्रयास करने के साथ इसकी तुलना करें, जो संकलित नहीं होगा।

list[0].A = 877; 

यह

+1

महान प्रश्न और एक [mcve] का उत्कृष्ट उदाहरण। ओपी। अगर कोई इसे आजमा देना चाहता है तो यहां एक [Fiddle] (https://dotnetfiddle.net/mM5wDH) है। –

+0

@himbrombeere क्यों परिवर्तन * * मानने योग्य है, नहीं क्यों वे किसी सूची में एक struct के एक मूल्य नहीं बदल सकते हैं सवाल पूछ रहा है। – Servy

उत्तर

2

संकलन नहीं होगा तो, जैसा कि आप सही ढंग से कहा है, list[0] सूची में मूल्य की एक प्रति है। यह एक मूल्य है, और एक चर नहीं है। struct में मानों में से एक ChildFoos है। उस क्षेत्र का मूल्य फू उदाहरणों का पूरा समूह नहीं है; इसके बजाए यह कहीं और संग्रहीत जानकारी के समूह का संदर्भ है (क्योंकि सरणी संदर्भ प्रकार हैं)। Foo उदाहरण की प्रति आपको वापस दिए गए संदर्भ में प्रति प्रतिलिपि है जिसमें सूची के अंदर उदाहरण है।

आप संदर्भ में ही उत्परिवर्तित करना हो तो ChildFoos को एक नई सरणी बताए द्वारा कहते हैं कि जब आप जैसे कि जब आप की कोशिश है कि struct, के किसी भी अन्य क्षेत्र उत्परिवर्तित करने की कोशिश, आप एक ही त्रुटि है कि आप देख देखना चाहते हैं A को म्यूट करने के लिए। यह आप केवल पढ़ने संदर्भ कि struct भंडार (और नहीं struct उदाहरण परिवर्तनशील) का मान रहे हैं, तो जा रहा है और है कि सरणी में पहला आइटम हो रही है, और सरणी इंडेक्सर के बाद से एक चर लौटने के लिए, नहीं एक है मूल्य (फिर से, आप सही तरीके से प्रश्न में नोट) परिवर्तनशील है कि लौटे Foo उदाहरण सरणी में उदाहरण के परिवर्तनशील है, के रूप में यह एक प्रति नहीं है, इसलिए जब आप का उपयोग है कि एक ही सरणी फिर से, बाद में, आप देख सकेंगे परिवर्तन।

संबंधित मुद्दे