2016-04-16 7 views
1

blittableでない構造体がある場合、それはどのようにコンパイラ/ CLRによって処理されますか?blittable以外の構造体は参照型として扱われますか?

たとえば、私がに渡したblittableでない構造体Xを持っていれば、「ref/out」キーワードが実際にこのメソッドに渡されますか?管理されたヒープまたはコンパイラ上の実際に割り当てられた構造体へのポインタは、メソッドに渡すときに構造体のインスタンスのコピーをスタックに作成しますか?

ありがとうございました。

+2

それはコピーを作成します。構造体に変更を加える必要がある場合は、[Out]を使用する必要があります。 –

+0

こんにちは@HansPassant。問題は、私が非同期メソッドを使用していることと、パラメータとして受け入れられないように見えることです。すなわち、ポインタ、ref、およびoutです。私はこの "限界"について読んでいます。私が見つけた回避策は、クラスタプルを使って参照を非同期メソッドに渡す方法です。この回避策に欠点があるかどうか知っていますか?ありがとう。 – ptr0x

+1

構造体である必要がありますか?最初にクラスを使用できますか? – argaz

答えて

0

BlittableおよびNon-Blittableの種類は、マーシャリングのコンテキストでのみ関連します。 structsを管理対象メソッドに渡すときは、通常の規則value typesが適用されます。つまり、コピーが作成されます。あなたがあなたのコメントから判断したいものです、あなたの元structを、ラップしたい場合には

、あなたは議論のオプションがTupleを使用することです、私はこのことから見唯一の欠点は、読みやすさです:Tuple.Item1/Item2は不明かもしれません。

別のオプションは、その唯一のプロパティとしてごstructを含んでいるでしょうラッパークラスを作ることです。

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

ありがとう! Tupleを使用することの唯一の欠点は読みやすさであれば、それは私のために非常に不自然なことです、私はこれに対処することができます。パフォーマンスやスケーラビリティなど、いくつかの危険な面を懸念していました。 – ptr0x