質問
マイクロソフトマイクロソフトIL、メソッドの呼び出し、値の型が必要な間接的な参考値です。きんいILGeneratorの"il"、現在はNullableのスタックしたい場合は、あらかとなっているかをチェックしい値になってしまう光の
var local = il.DeclareLocal(typeof(Nullable<int>));
il.Emit(OpCodes.Stloc, local);
il.Emit(OpCodes.Ldloca, local);
var method = typeof(Nullable<int>).GetMethod("get_HasValue");
il.EmitCall(OpCodes.Call, method, null);
しかしくなれば良いと思いますスキップすることでもないローカル変数として、単なるメソッドを呼び出しにアドレスの変数をスタックのようなもの:
il.Emit(/* not sure */);
var method = typeof(Nullable<int>).GetMethod("get_HasValue");
il.EmitCall(OpCodes.Call, method, null);
のldind家族の指示が期待(特にldind_ref)において十分な文書かどうかを知ることがボクシングの価値は、疑いのではない。
私の場合はC#のコンパイラの出力で用地変そのために、私を信じる第一の方法は膨大なものとなる。誰にでもしてより良いアイデア、浮かぶのでしょうか。
****編集:注意事項****
るメソッドを呼び出し、プロパティは、オブジェクトでは、ラインコメントアウトされていな作業をすることができ操作が不安定にし、実行").Strncasecmp行いることは期待した動作に復帰します。
var m = new DynamicMethod("M", typeof(bool), Type.EmptyTypes);
var il = m.GetILGenerator();
var ctor = typeof(Nullable<int>).GetConstructor(new[] { typeof(int) });
il.Emit(OpCodes.Ldc_I4_6);
il.Emit(OpCodes.Newobj, ctor);
//var local = il.DeclareLocal(typeof(Nullable<int>));
//il.Emit(OpCodes.Stloc, local);
//il.Emit(OpCodes.Ldloca, local);
var getValue = typeof(Nullable<int>).GetMethod("get_HasValue");
il.Emit(OpCodes.Call, getValue);
il.Emit(OpCodes.Ret);
Console.WriteLine(m.Invoke(null, null));
できますので簡単なメソッドを呼び出しの値をスタックで価値の型ができあった場合は、基準タイプ)です。
うめ(または知ることが可能かどうかは置き換えを行されたが、さま、ありがとうございました、プログラムワーを使用せず、仮ます。
解決
場合には、変数のスタックでは見ていて気分が良いものだけ出の方法。
このコンストラクタがなを押して変数をスタックに入力す。掘へのIL少である利用方法は変数の後に構築します。
を読み込むことができ、変数のデータを蓄積するとともに、参考に評価スタックの前に呼び出しのコンストラクタ、負荷変動を再度呼び出した後、コンストラクタはこのように:
DynamicMethod method = new DynamicMethod("M", typeof(bool), Type.EmptyTypes);
ILGenerator il = method.GetILGenerator();
Type nullable = typeof(Nullable<int>);
ConstructorInfo ctor = nullable.GetConstructor(new Type[] { typeof(int) });
MethodInfo getValue = nullable.GetProperty("HasValue").GetGetMethod();
LocalBuilder value = il.DeclareLocal(nullable);
// load the variable to assign the value from the ctor to
il.Emit(OpCodes.Ldloca_S, value);
// load constructor args
il.Emit(OpCodes.Ldc_I4_6);
il.Emit(OpCodes.Call, ctor);
il.Emit(OpCodes.Ldloca_S, value);
il.Emit(OpCodes.Call, getValue);
il.Emit(OpCodes.Ret);
Console.WriteLine(method.Invoke(null, null));
その他のオプションは、この方法で表示します。理由はただそれだけこのときは、ctorのメソッドに無効な入れないその値をスタックのようなその他の方法。ではもう珍しい機能をもった話ができSetloc場合は、新しいオブジェクトになるというスタックです。
他のヒント
など、見所がたくさんあり、オプションもますます進んだとはできません。ご検討のスタック行動のMSIL指示ることが確認できないop葉をそのオペランドのスタックです。以来、この要件取得のアドレススタックentry'op、私はかなりの自信につなが存在します。
だからdup+ボックスまたはstloc+ldloca.どんな指摘の通り、後者はより効率的です。
@greg:多くの指示を 結果 スタックが、指示が出また、入力信号についても、当社 オペランド スタックが必要とする取得のスタック要素アドレス'ました。
きっかけになるかもしれないとで参加申込をお願いします!幸運にも私の unbox
opcodeしていないので押しの 住所 の値です。 unbox.any
押さえつけ、実際の値です。なので、呼び出すためのメソッドが値型をせずに大切に保管してくださ局所変数とその負荷はその住所、 box
次いで unbox
.ご利用前の例:
var m = new DynamicMethod("M", typeof(bool), Type.EmptyTypes);
var il = m.GetILGenerator();
var ctor = typeof(Nullable<int>).GetConstructor(new[] { typeof(int) });
il.Emit(OpCodes.Ldc_I4_6);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Box, typeof(Nullable<int>)); // box followed by unbox
il.Emit(OpCodes.Unbox, typeof(Nullable<int>));
var getValue = typeof(Nullable<int>).GetMethod("get_HasValue");
il.Emit(OpCodes.Call, getValue);
il.Emit(OpCodes.Ret);
Console.WriteLine(m.Invoke(null, null));
の下振れはボクシングの原因のメモリ割り当てのための弁当のオブジェクトでは、以下の利用局所変数(既に割り当て).で保存することから決めることを宣言します、ご参考すべてのローカルな変数があります。
だけ書いているクラスなどのOPたしていることをご確認いただ...こちらはILコードC#コンパイラの生産:
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: newobj instance void valuetype [mscorlib]System.Nullable`1<int32>::.ctor(!0)
IL_000f: stfld valuetype [mscorlib]System.Nullable`1<int32> ConsoleApplication3.Temptress::_X
IL_0014: nop
IL_0015: ret