2016-04-16 17 views
1

Wenn ich eine nicht blitable Struktur habe, wie wird es vom Compiler/CLR behandelt?Sind nicht blitable Strukturen als Referenztyp behandelt?

Zum Beispiel: wenn ich eine nicht blitable Struktur X habe, die ich ohne das Schlüsselwort 'ref/out' zu einer Methode, was wird eigentlich an diese Methode übergeben werden? Ein Zeiger auf die tatsächlich zugewiesene Struktur auf dem verwalteten Heap oder dem Compiler erstellt eine Kopie der Instanz der Struktur auf dem Stapel, wenn sie an die Methode übergeben wird?

Danke.

+2

Es macht eine Kopie. Wenn Sie Änderungen an der zu kopierenden Struktur benötigen, müssen Sie [Out] verwenden. –

+0

Hallo @HansPassant. Das Problem ist, dass ich Async-Methoden verwende und sie scheinen nicht als Parameter zu akzeptieren: Zeiger, Ref und Out. Ich lese über diese "Einschränkung" und eine Problemumgehung, die ich fand, besteht darin, die Klasse Tuple zu verwenden, um die Referenzen zu halten, die an die asynchrone Methode übergeben werden. Weißt du, ob diese Problemumgehung irgendwelche Nachteile hat? Vielen Dank. – ptr0x

+1

Muss es eine Struktur sein? Kannst du überhaupt eine Klasse benutzen? – argaz

Antwort

0

Blittable und Non-Blittable Typen sind nur im Zusammenhang mit Marshalling relevant. Bei der Übergabe von structs an verwaltete Methoden gelten die regulären Regeln von value types, dh es wird eine Kopie erstellt.

Falls Sie Ihre ursprüngliche struct wickeln wollen, das ist, was Sie von Ihren Kommentaren zu urteilen wollen, ist die Option, die Sie diskutiert wird, ist eine Tuple zu verwenden, ist der einzige Nachteil ich daraus ersehen, ist die Lesbarkeit: Tuple.Item1/Item2 unklar sein kann.

Eine weitere Möglichkeit ist eine Wrapper-Klasse, die Ihre struct als einzige Eigenschaft enthalten würde:

class StructWrapper 
{ 
    YourStruct Value { get; set; } 
} 
+0

Danke! Wenn der einzige Nachteil der Verwendung von Tuple Lesbarkeit ist, ist es sehr chap für mich, ich kann damit umgehen. Ich war besorgt über einige gefährlichere Nachteile wie Leistung, Skalierbarkeit usw. – ptr0x

Verwandte Themen