「out」パラメーターに値タイプを渡すと、変数はボックス化されますか?
-
24-10-2019 - |
質問
私はそれを知っています ボクシングとボクシングは比較的高価です パフォーマンスの観点から。私が疑問に思っているのは:
値のタイプをメソッドに渡します out
パラメーターは、変数のボクシング/ボクシングを引き起こします(したがってパフォーマンスヒット)?コンパイラはこれを最適化できますか?
int number;
bool result = Int32.TryParse(value, out number);
解決
他の人が指摘したように、ここにはボクシングはありません。 outまたはrefパラメーターに対応する引数として変数を渡す場合、あなたがしていることは 変数にエイリアスを作成します. 。あなたは何もしていません 価値 変数の。 2つの変数が同じストレージの場所を表しています。
ボクシングは、値タイプの値が参照タイプの値に変換され、例にはいかなる種類の変換もない場合にのみ発生します。もちろん、参照タイプはsystem.object、system.valueType、system.enumまたは任意のインターフェイスである必要があります。通常、それはかなり明確です。コードには明示的または暗黙的な変換があります。ただし、それほど明確ではない状況がある場合があります。たとえば、構造体のベースタイプの非装備されていない仮想メソッドが呼び出されると、ボクシングがあります。 (特定の種類の一般的なタイプの制約が予期しないボクシングを引き起こす可能性のある奇妙な状況もありますが、通常は実際には現れません。)
他のヒント
ボクシングはありませんが、コンパイラはldloca.s命令を使用して、ローカル変数への参照をスタック(http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldloca_s(vvs)に押します。 71).aspx)
.method private hidebysig static void Func() cil managed
{
.maxstack 2
.locals init (
[0] int32 num,
[1] bool flag)
L_0000: nop
L_0001: ldstr "5"
L_0006: ldloca.s num
L_0008: call bool [mscorlib]System.Int32::TryParse(string, int32&)
L_000d: stloc.1
L_000e: ret
}
いいえ、ボクシングはありません(必要/関与)。
変数をボックスにするとき、ボックス付きインスタンスの変更はオリジナルに影響しません。しかし、それはまさにそれです out
することになっています。
コンパイラの「どういうわけか」は、元の変数への参照を構築します。
ボクシングはありません。何 out
パラメーターは、その番号を内に割り当てる必要があることを指定します TryParse
方法。これに関係なく、それはまだ int
, 、ではありません object
.