OpCodes.Tailcall フィールド

定義

実際の呼び出し命令が実行される前に現在のメソッドのスタック フレームが削除されるように、後置メソッド呼び出し命令を実行します。

public: static initonly System::Reflection::Emit::OpCode Tailcall;
public static readonly System.Reflection.Emit.OpCode Tailcall;
 staticval mutable Tailcall : System.Reflection.Emit.OpCode
Public Shared ReadOnly Tailcall As OpCode 

フィールド値

注釈

次の表に、命令の 16 進数および Microsoft Intermediate Language (MSIL) アセンブリ形式と、簡単なリファレンス概要を示します。

フォーマット アセンブリ形式 Description
FE 14 尾。 後続の呼び出しで現在のメソッドが終了する

この命令にはスタック遷移動作が定義されていません。

tailプレフィックス命令は、CallCalli、またはCallvirt命令の直前に置く必要があります。 これは、呼び出し命令が実行される前に、現在のメソッドのスタック フレームを削除する必要があることを示します。 また、次の呼び出しから返される値も現在のメソッドによって返される値であり、したがって、呼び出しをメソッド間ジャンプに変換できることを意味します。

スタックは、次の呼び出しによって転送される引数を除き、空である必要があります。 呼び出し命令の後の命令は ret である必要があります。したがって、唯一の有効なコード シーケンスは tail. call (または calli または callvirt) です。 正しい Microsoft Intermediate Language (MSIL) 命令は、call 命令に分岐してはなりませんが、後続の Ret に分岐する可能性があります。

信頼されていないコードから信頼されたコードに制御が転送されると、コード ID のセキュリティが損なわれるため、現在のフレームを破棄できません。 そのため、.NET Framework のセキュリティ チェックにより、tailが無視され、標準の Call 命令が残される可能性があります。 同様に、呼び出しが戻った後に同期リージョンの終了を実行できるようにするために、 tail プレフィックスは、同期済みとマークされたメソッドを終了するために使用されるときに無視されます。

次の Emit メソッドオーバーロードでは、 tail オペコードを使用できます。

適用対象