2016-08-09 1 views
2

알 수없는 구조체 배열이 있습니다. 나는 어떤 인덱스를 얻으려고 할 때 나는이 개체의 새 인스턴스를 얻을 :Array.GetValue()는 구조체 객체의 새 인스턴스를 반환합니다.

var inst = ((SomeStruct)((Array)arrOfSomeStruct).GetValue(0)); 

이제 이달arrOfSomeStruct에서 다른 인스턴스 [0]을.

무엇 배열 항목의 원본 인스턴스를 얻을 수있는 최고의 또는 빠른 방법이며, NOT [] 연산자를 사용하여?

+0

: 일부 극단적 인가지 경우에

는 안전하지 않은 코드의 사용은 최후의 수단인가? – Enigmativity

+0

정말 성취하려는 것은 무엇입니까? 'var inst2 = inst1;'처럼 구조체 값을 변수에 __assign__하자마자 값이 복사되어 새로운 인스턴스가 생성됩니다. 'var inst = (SomeStruct) obj;'와 같이'object' 박스에있는 구조체 값을 __unbox__하자마자 새로운 값/인스턴스가 생성됩니다. 'public object GetValue() {/ * ... */return someStruct/* boxing!}과 같이 구조체 값을 암시 적으로 __box__하자마자! * /; }'새 인스턴스가 새 상자에 만들어집니다. 구조체를 변경할 수 있거나 변경할 수 있습니까? –

+0

'var inst = orig_arr.GetValue (0); inst.x = 5; // 이제 orig_arr.x! = inst.x' – Guy

답변

2

이것은 기본 동작을 사용해야 원하는

작동합니다. 참조 된 것이 아니라 복사됩니다. 이는 GetValue 메소드 (예 : this[index])뿐만 아니라 구조체가있는 모든 교환기에서 동일합니다. Jeppe Stig Nielsen로서

주석 :

...이 치형의 배열을 위해, .GetValue(0) 박스에 대한 참조 구조체 값 복사 반환한다. 반면에 [0]은 원래 구조체 값입니다. 변수에 할당 할 경우 다음 var valueCopy = arr[0];과 같이 복사가 이루어집니다. 그러나 이는 주로 가변 값 유형과 관련이 있습니다. 구조체에 구조체 값을 변경하는 멤버가있는 경우 arr[0].MutateValue();은 원본을 변경합니다. 물론 valueCopy.MutateValue();은 사본을 변경합니다.

가장 좋은 옵션은 구조체를 개체로 만드는 것입니다. 수업으로 이동하십시오. 당신이 그 소스`struct`을 필요로 할 려

unsafe 
{ 
    Point p = new Point(1, 2); 
    Point*[] points = new Point*[] { &p }; 

    Point* p2 = points[0]; 

    p2->X = 2; // this changes both p and p2 
} 
+2

값 유형의 배열에 대해 '.GetValue (0)'은 구조체 값의 _boxed copy_에 대한 참조를 반환합니다. 반면에'[0]'은 원래 구조체 값입니다. 변수에 대입하면, 'var valueCopy = arr [0];'처럼 복사가 이루어집니다. 그러나 이는 주로 가변 값 유형과 관련이 있습니다. 구조체에 구조체 값을 변경시키는 멤버가 있으면'arr [0] .MutateValue();'는 원본을 변경합니다. 물론 'valueCopy.MutateValue();'는 복사본을 변경합니다. –

+0

좋습니다. 아주 명확합니다. 명확히 해 주셔서 감사합니다. –

4

value type 인 경우 원본을 가져올 수 없습니다. Value Type은 메소드에서 리턴되거나 메소드로 전달 된 경우에 복사됩니다. 당신이 구조체와의 상호 작용의 reference type(class)