2016-08-09 73 views
2

Ich habe ein unbekanntes Array des Strukturtyps. Wenn ich versuche, etwas Index zu bekommen bekomme ich eine neue Instanz dieses Objekts:Array.GetValue() gibt eine neue Instanz eines Strukturobjekts zurück

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

Jetzt inst von arrOfSomeStruct eine andere Instanz ist [0].

Was ist die beste oder die schnellsten Weise die ursprüngliche Instanz des Array-Elements zu erhalten und nicht durch [] Operatoren?

+0

Was versuchen Sie zu tun, dass die Quelle erfordert 'struct'? – Enigmativity

+0

Was wollen Sie wirklich erreichen? Sobald Sie einer Variablen einen Strukturwert wie in 'var inst2 = inst1;' zuweisen, wird der Wert kopiert, sodass eine neue Instanz erstellt wird. Sobald Sie einen Strukturwert, der sich in einer 'object'-Box befand, wie in' var inst = (SomeStruct) obj; '' __unbox__, wird ein neuer Wert/eine neue Instanz erzeugt. Sobald Sie implizit __box__ einen struct-Wert haben, wie in 'public object GetValue() {/ * ... */return someStruct/* boxing! * /; } ', eine neue Instanz wird in einer neuen Box erstellt. Ist Ihre Struktur veränderlich oder unveränderlich, da Sie sich um all das kümmern? –

+0

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

Antwort

2

Dies ist das Standardverhalten der Interaktion verwenden. Es wird kopiert, nicht referenziert. Dies gilt für jeden Austausch mit einer Struktur, nicht nur für Ihre GetValue Methode (z. B. this[index]).

Als Jeppe Stig Nielsen kommentiert:

... für eine Anordnung von Wertetypen, .GetValue(0) gibt einen Verweis auf eine geschachtelte des struct Wert kopieren. Auf der anderen Seite ist [0] der ursprüngliche Strukturwert. Wenn Sie einer Variablen zuweisen, wird eine Kopie erstellt, wie in var valueCopy = arr[0];. Dies ist jedoch vor allem für änderbare Werttypen relevant. Wenn die Struktur einen Member hat, der den Strukturwert mutiert, mutiert arr[0].MutateValue(); das Original. Natürlich wird valueCopy.MutateValue(); die Kopie ändern.

Die beste Option, die Sie haben, ist die Struktur ein Objekt zu machen, dh. Zu einer Klasse wechseln.

In einigen extremen Fällen ist die Verwendung von unsicherem Code ein letzter Ausweg:

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

Um zu klären, gibt '.GetValue (0) 'für ein Array von Werttypen einen Verweis auf eine _boxed Kopie_ des Strukturwerts zurück. Auf der anderen Seite ist '[0] 'der ursprüngliche Strukturwert. Wenn Sie eine Variable zuweisen, dann wird eine Kopie erstellt, wie in 'var valueCopy = arr [0];'. Dies ist jedoch vor allem für änderbare Werttypen relevant. Wenn die Struktur ein Member hat, der den Strukturwert mutiert, dann wird 'arr [0] .MutateValue();' das Original mutieren. Natürlich wird 'valueCopy.MutateValue();' die Kopie ändern. –

+0

Okay, sehr klar. Danke fürs klarstellen. –

4

Sie können das Original nicht erhalten, wenn es ein value type ist. Jedes Value Type wird kopiert, wenn es von der Methode zurückgegeben oder an die Methode übergeben wird.

arbeiten, wie Sie möchten, ein mit einer Struktur reference type(class)