रीज़ा द्वारा धागे के बाद मेरे दिमाग में उठाया गया प्रश्न।सूची <T> और सरणी अनुक्रमणिका के बीच क्या अंतर है?
तो, पर विचार निम्नलिखित struct
और interface
(definetely बहुत उपयोगी नहीं है, लेकिन सिर्फ इस मुद्दे को दिखाने के लिए):
public interface IChangeStruct
{
int Value { get; }
void Change(int value);
}
public struct MyStruct : IChangeStruct
{
int value;
public MyStruct(int _value)
{
value = _value;
}
public int Value
{
get
{
return value;
}
}
public void Change(int value)
{
this.value = value;
}
}
MyStruct
IChangeStruct
लागू करता है, तो हम सही ढेर में इसके बारे में एक बॉक्स्ड प्रति बदल सकते हैं अनबॉक्सिंग के बिना और एक नए के साथ बदलना। यह निम्नलिखित कोड के साथ demostrated जा सकता है:
List<MyStruct> l2 = new List<MyStruct>
{
new MyStruct(0)
};
Console.WriteLine(l2[0].Value); //0
l2[0].Change(10);
Console.WriteLine(l2[0].Value); //also 0
जहां तक मैं समझ गया, पहले मामले l1[0]
में बॉक्सिंग के लिए referense लौटे:
MyStruct[] l1 = new MyStruct[]
{
new MyStruct(0)
};
Console.WriteLine(l1[0].Value); //0
l1[0].Change(10);
Console.WriteLine(l1[0].Value); //10
अब, चलो List<T>
को सरणी बदलने के लिए, यानी जाने संरचना, जबकि दूसरे में - यह और बाकी था।
मैं भी इस एकत्रित न करने की कोशिश की और पाया:
1) MyStruct[]
के लिए:
IL_0030: ldelema Utils.MyStruct IL_0035: ldc.i4.s 10 IL_0037: call instance void Utils.MyStruct::Change(int32)
2) List<MyStruct>
के लिए:
IL_007c: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<valuetype Utils.MyStruct>::get_Item(int32)
IL_0081: stloc.s CS$0$0001
IL_0083: ldloca.s CS$0$0001
IL_0085: ldc.i4.s 10
IL_0087: call instance void Utils.MyStruct::Change(int32)
लेकिन मैं होने के कारण इसे अच्छी तरह से समझने के लिए तैयार नहीं है।
तो, List<T>
वापस क्या हुआ? या इंडेक्स द्वारा सरणी और List<T>
वापसी तत्व कैसे करते हैं? या यह केवल मूल्य प्रकार के साथ मामला है और संदर्भ प्रकारों से कोई लेना देना नहीं है?
पी.एस .: मैं समझते हैं कि एक नहीं करना चाहिए परिवर्तन एक मान प्रकार उदाहरण है, लेकिन वर्णित मुद्दा मुझे समझने बना कर , मैं कभी पता चला कि List<T>
और सरणी काम करते हैं।
Arrays केवल तब ही क्षमता है जब 0 अनुक्रमित और एकल आयामी सही है? (चूंकि 'ldelema' केवल उन प्रतिबंधों के तहत काम कर सकता है) – Earlz