blittableでない構造体がある場合、それはどのようにコンパイラ/ CLRによって処理されますか?blittable以外の構造体は参照型として扱われますか?
たとえば、私がをに渡したblittableでない構造体Xを持っていれば、「ref/out」キーワードが実際にこのメソッドに渡されますか?管理されたヒープまたはコンパイラ上の実際に割り当てられた構造体へのポインタは、メソッドに渡すときに構造体のインスタンスのコピーをスタックに作成しますか?
ありがとうございました。
blittableでない構造体がある場合、それはどのようにコンパイラ/ CLRによって処理されますか?blittable以外の構造体は参照型として扱われますか?
たとえば、私がをに渡したblittableでない構造体Xを持っていれば、「ref/out」キーワードが実際にこのメソッドに渡されますか?管理されたヒープまたはコンパイラ上の実際に割り当てられた構造体へのポインタは、メソッドに渡すときに構造体のインスタンスのコピーをスタックに作成しますか?
ありがとうございました。
Blittable
およびNon-Blittable
の種類は、マーシャリングのコンテキストでのみ関連します。 structs
を管理対象メソッドに渡すときは、通常の規則value types
が適用されます。つまり、コピーが作成されます。あなたがあなたのコメントから判断したいものです、あなたの元struct
を、ラップしたい場合には
、あなたは議論のオプションがTuple
を使用することです、私はこのことから見唯一の欠点は、読みやすさです:Tuple.Item1/Item2
は不明かもしれません。
別のオプションは、その唯一のプロパティとしてごstruct
を含んでいるでしょうラッパークラスを作ることです。
class StructWrapper
{
YourStruct Value { get; set; }
}
ありがとう! Tupleを使用することの唯一の欠点は読みやすさであれば、それは私のために非常に不自然なことです、私はこれに対処することができます。パフォーマンスやスケーラビリティなど、いくつかの危険な面を懸念していました。 – ptr0x
それはコピーを作成します。構造体に変更を加える必要がある場合は、[Out]を使用する必要があります。 –
こんにちは@HansPassant。問題は、私が非同期メソッドを使用していることと、パラメータとして受け入れられないように見えることです。すなわち、ポインタ、ref、およびoutです。私はこの "限界"について読んでいます。私が見つけた回避策は、クラスタプルを使って参照を非同期メソッドに渡す方法です。この回避策に欠点があるかどうか知っていますか?ありがとう。 – ptr0x
構造体である必要がありますか?最初にクラスを使用できますか? – argaz