Is it possible to access a reference of a struct from a List to make changes? 스레드가 리자에 의해 내 마음에 제기 된 질문.리스트 <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>
로 배열을 변경할 수 있습니다 구조체, 반면에 두 번째 - 그 밖의 smth했다.
나는 또한이 분해 시도하고 발견
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>
요소를 인덱스로 반환하는 방법은 무엇입니까? 또는 값 유형이있는 유일한 경우이며 참조 유형과 관련이 없습니까?
P.S는 : 나는 한 되지해야 변화 값 유형 인스턴스하지만, 기술 문제가 나를 이해하게 이해 할 , 나는 결코 실현되지 방법 List<T>
및 배열 작업.
어레이는 인덱스가 0이고 1 차원 인 경우에만이 기능을 사용할 수 있습니까? ('ldelema'는 그 제한 하에서 만 작동 할 수 있기 때문에) – Earlz