2016-04-16 34 views
1

如果我有一個非blittable結構,它是如何處理的編譯器/ CLR?是否將不可綁定的結構視爲參考類型?

例如:如果我有一個非blittable結構X,我通過沒有的「REF /出」關鍵字的一些方法,究竟會被傳遞給此方法?指向託管堆或編譯器上實際分配的結構的指針會在傳遞給方法時將結構實例的副本放到堆棧上?

謝謝。

+2

它使一個副本。如果你需要對被複制的結構進行修改,那麼你必須使用[Out]。 –

+0

Hi @HansPassant。問題是我正在使用異步方法,並且它們看起來不接受作爲參數:指針,ref和out。我正在閱讀關於這個「限制」,我發現一個解決方法是使用類Tuple來保存傳遞給異步方法的引用。你知道這個解決方法是否有缺點?謝謝。 – ptr0x

+1

它是否必須是一個結構?你可以首先使用課程嗎? – argaz

回答

0

BlittableNon-Blittable類型僅在編組上下文中相關。 當將structs傳遞給託管方法時,將應用value types的常規規則,即表示進行復制。

如果你想換你原來struct,這是你想從你的意見來看什麼,你討論的選項是使用Tuple,我從這個看到的唯一的缺點是可讀性:Tuple.Item1/Item2可能不清楚。

另一種選擇是做一個包裝類,將包含您struct作爲其唯一的屬性:

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

謝謝!如果使用Tuple的唯一缺點是可讀性,那麼對我而言,這是非常適合的,我可以解決這個問題。我擔心性能,可擴展性等更危險的缺點。 – ptr0x

相關問題