2016-11-23 1 views
0

Hat C# eine Struktur hier boxen?C# -Box oder Kopie beim Übergeben von Strukturen als Referenz?

struct S { int x; } 

void foo(ref S s) { s.x = 1; } 

main { 
    var s = new S(); 
    foo(ref s); <-- boxing?? 
} 

Ich habe seltsame Dinge über structs in Klassen gehört. Gibt es hier Boxen? Übergibt das eine Kopie des Mitglieds?

class C { S s; } 

main { 
    var c = new C(); 
    foo(ref c.s); <-- boxing here?? copy here??? 
} 
void foo(ref S s) { s.x = 1; } 
+1

Was ist der Sinn von 'ref' wäre, wenn es in einer Kopie gemacht werden geführt? Das passiert ohne 'ref'. Also muss 'ref', um nicht völlig redundant zu sein, anders sein, indem ... keine Kopie erstellt wird. – stakx

+0

Ich bin ein C++ Entwickler. Wenn ich sehe, was C# tut, scheint alles redundant zu sein! :) Ich möchte genau wissen, was mich etwas kostet, bevor ich es benutze. Warum also würde man den Werttyp nicht in einen Werttyp eingeben, so dass er ihn wie einen Referenztyp übergeben könnte. Frage nur. – johnnycrash

+2

Es gibt keine Kopie oder Boxing in einem Ihrer Code-Snippets. –

Antwort

4

So ist Struct Werttyp, wenn Sie in der Dokumentation von ref

lesen Sie das Konzept der Weitergabe durch Bezugnahme mit dem Konzept der Referenztypen nicht verwirren. Die beiden Konzepte sind nicht gleich. Verfahren Parameter können durch ref geändert werden, unabhängig davon, ob es sich um einen Werttyp oder ein Referenztyp. Es gibt KEINE Boxen eines Werttyps, wenn es durch Referenz übergeben wird.

ref (C# Reference)

Hier Erklärung, was genau tut ref.

Das Schlüsselwort ref bewirkt, dass ein Argument als Verweis übergeben wird, nicht durch Wert. Die Wirkung des durch das Bezug vorbei ist, dass jede Änderung des Parameter in der aufgerufenen Methode wird in der aufrufenden Methode reflektiert.

+0

Was ist mit dem Fall, wenn die Struktur ein Mitglied einer Klasse ist? – johnnycrash

+0

@johnnacrash das Struct ist immer noch Werttyp, also kein Unterschied. – mybirthname

Verwandte Themen