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)程序集格式,以及简短的参考摘要:

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

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

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

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

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

以下 Emit 方法重载可以使用 tail 操作码:

适用于