Is it possible to access a reference of a struct from a List to make changes?由reza在我腦海中提出的問題。列表<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
,所以我們可以直接在堆改變它的盒裝拷貝無需拆箱並換上新的。這可以用下面的代碼實例闡述:
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>
,即:
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到盒裝結構,而在第二個 - 它是別人。
我也試圖拆開,發現這個:
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>
返回什麼?或者如何做array和List<T>
按索引返回元素?或者這只是值類型的情況,並且與引用類型無關?
P.S:我做明白,一個不得變化的值類型的實例,但所描述的問題,讓我明白了,我從來沒有意識到如何List<T>
和陣列的工作。
數組只有0的索引和單維纔有這種能力嗎? (因爲'ldelema'只能在這些限制下工作) – Earlz