ref
と の間でどちらが軽いか誰か教えてくださいout
。キーワードと使用法ref
の正確な違いも知っています。out
私の場合、 と の両方を使用できますref
がout
、軽い方を疑問に思っています。
誰かが参照する必要がある場合は、ここにアクセスして、軽いものを教えてください。
前もって感謝します..
唯一の違いは、コンパイラのヒントです。
... アウト ...
public static void TestOut(out int test)
{
test = 1;
}
.method public hidebysig static void TestOut([out] int32& test) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: stind.i4
IL_0003: ret
} // end of method Program::TestOut
...参照..。
public static void TestRef(ref int test)
{
test = 1;
}
.method public hidebysig static void TestRef(int32& test) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: stind.i4
IL_0003: ret
} // end of method Program::TestRef
...out
そしてref
事実上同じです。唯一の本当の違いは、outが、メソッドが返される前に値が設定されることを期待するようにコンパイラーに指示することです。フラグのある関数に値を送信することもできますがout
、コンパイラーはそれを未割り当ての変数として扱います。ランタイムは実際には気にしません。どちらも変数へのポインタとして作成されます。関数に期待する機能を説明するキーワードを使用するのが最適です。これより下のJITerで「行われる可能性のある」最適化は、アプリケーションにほぼ0の影響を及ぼします。
これはマイクロ最適化です。
実際、両方のオプションに対して生成されているILコードを見ると、違いはわかりません。Matthew Whitedが示したコンパイラのヒントを除いて:
.method private hidebysig static void Out([out] valuetype [mscorlib]System.DateTime& d) cil managed
.method private hidebysig static void Ref(valuetype [mscorlib]System.DateTime& d) cil managed
手元の状況に対して意味的に最も正しいオプションを提案するだけです。
低レベルでは同じである可能性が高いです。パフォーマンスの違いがある場合、それはおそらく無視できるものであり、最適化するより良い場所があります。
このリンク 、特に「結論 4:」のセクションを参照してください。
「out」と「ref」は、実際には舞台裏でまったく同じです。CLR は "ref" のみをサポートします。「out」は単なる「ref」であり、コンパイラは、問題の変数が確実に割り当てられていることがわかっている場合に関して、わずかに異なる規則を適用します。そのため、out/ref-ness のみが異なるメソッドのオーバーロードを作成することは違法です。CLR はそれらを区別できません。したがって、out のタイプ セーフの規則は、ref の場合と同じでなければなりません。
out
の観点から実装されてref
おり、唯一の違いは何をコンパイルするかであり、実行時のパフォーマンスは同じです。