5

誰かがMSILのこれらの数行を説明できますか?値を評価スタックからローカル変数に移動し、すぐに戻して返すだけなのはなぜですか?

次のMSILコードは、単一の引数(文字列)をロードし、boolを返すメソッドを呼び出してから、そのbool値を返します。私が理解していないのは、なぜstloc.0を呼び出してメソッドの戻り値をローカル変数に格納し、次にラベル付けされた次の行に明示的な無条件の制御転送を実行して(不要のようです)、値を元に戻すだけです。返す前の評価スタック。

.maxstack 1
.locals init ([0] bool CS$1$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: call bool FuncNameNotImporant::MethodNameNotImporant(string)
L_0007: stloc.0 
L_0008: br.s L_000a
L_000a: ldloc.0 
L_000b: ret 

なぜこれが行われるのかについての私の最も良い推測は、評価スタックの値が実際にブール値であることを確認してから返す前に、ある種の型チェックを実行することです。しかし、私は次の行への明示的なジャンプについてはわかりません。つまり、とにかくそこに行きませんか?メソッドのC#ソースコードは1行だけで、メソッドの結果を返します。

4

2 に答える 2

4

デバッグ モードまたはリリース モードでコンパイルしていますか? リリースモードでは、次のようになります。

.method private hidebysig static bool Test1(string arg) cil managed
{
    .maxstack 8
    L_0000: ldarg.0 
    L_0001: call bool FuncNameNotImportant::MethodNameNotImportant(string)
    L_0006: ret 
}

表示されている分岐は、おそらくデバッガーのサポート用です。

于 2009-05-18T22:35:18.420 に答える