次の方法で共有


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) アセンブリ形式と、簡単な参照の概要を示します。

形式 アセンブリ形式 説明
FE 14 尾。 後続の呼び出しでは、現在のメソッドが終了します

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

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

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

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

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

適用対象