実際の呼び出し命令が実行される前に、現在のメソッドのスタック フレームが削除されるように、後置のメソッド呼び出し命令を実行します。
Public Shared ReadOnly Tailcall As OpCode
[C#]
public static readonly OpCode Tailcall;
[C++]
public: static OpCode Tailcall;
[JScript]
public static var Tailcall : OpCode;
解説
命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。
形式 | アセンブリ形式 | 説明 |
---|---|---|
FE 14 | tail. | 後続の呼び出しが、現在のメソッドを終了します。 |
この命令には、スタックの遷移動作は定義されていません。
tail プリフィックス命令は、 Call 、 Calli 、または Callvirt の各命令の直前に置く必要があります。これは、呼び出し命令が実行される前に、現在のメソッドのスタック フレームを削除する必要があることを示します。また、後続の呼び出しからの戻り値は現在のメソッドから返された値でもあり、このため、この呼び出しをメソッド間ジャンプに変換できることも意味しています。
後続の呼び出しによって転送される引数を除き、スタックは空である必要があります。呼び出し命令の後続の命令は、ret である必要があります。したがって、有効なコード シーケンスは tail. call (あるいは calli または callvirt) だけです。正しい MSIL (Microsoft Intermediate Language) 命令は、 call 命令に分岐できませんが、その後続の Ret には分岐できます。
現在のフレームは、信頼関係のないコードから信頼されるコードに制御が転送されたときには、破棄できません。このときにフレームを破棄すると、コード ID セキュリティが損なわれるためです。したがって、.NET Framework セキュリティ チェックによって tail が無視され、標準 Call 命令となることがあります。同様に、呼び出しが戻った後に同期された領域を終了できるようにするために、同期されたことを示すマークが付いたメソッドを終了するために使用される tail プリフィックスは、無視されます。
tail オペコードを使用できる Emit コンストラクタ オーバーロードを次に示します。
- ILGenerator.Emit(OpCode)
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ