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 

字段值

注解

下表列出了指令的十六进制和 Microsoft 中间语言 (MSIL) 程序集格式,以及简短的参考摘要:

格式 程序集格式 说明
FE 14 尾巴。 后续调用将终止当前方法

没有为此指令定义堆栈转换行为。

前缀tail指令必须紧跟在 、 CalliCallvirt 指令之前Call。 它指示在执行调用指令之前,应删除当前方法的堆栈帧。 它还意味着,从以下调用返回的值也是当前方法返回的值,因此,该调用可以转换为跨方法跳转。

堆栈必须为空,但以下调用传输的参数除外。 调用指令后面的指令必须是 ret。因此,唯一有效的代码序列是 tail. call (或 callicallvirt) 。 正确的 Microsoft 中间语言 (MSIL) 指令不得分支到指令 call ,但可以分支到后续 Ret的 。

当控制权从不受信任的代码转移到受信任的代码时,不能放弃当前帧,因为这会危及代码标识安全。 因此,.NET Framework安全检查可能会导致 tail 被忽略,留下标准Call指令。 同样,为了允许在调用返回后退出同步区域, tail 当用于退出标记为“已同步”的方法时,将忽略前缀。

以下 Emit 方法重载可以使用 tail opcode:

适用于