OpCodes.Tailcall 字段
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
执行后缀的方法调用指令,以便在执行实际调用指令前移除当前方法的堆栈帧。
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
指令必须紧接在 、 Calli或 Callvirt 指令之前Call。 它指示在执行调用指令之前,应删除当前方法的堆栈帧。 它还意味着从以下调用返回的值也是当前方法返回的值,因此该调用可以转换为跨方法跳转。
堆栈必须为空,但以下调用传输的参数除外。 调用指令后面的指令必须是 ret。因此,唯一有效的代码序列是 tail. call
(或 calli
或 callvirt
) 。 正确的 Microsoft 中间语言 (MSIL) 指令不得分支到指令 call
,但它们可以分支到后续 Ret的 。
当控制权从不受信任的代码转移到受信任的代码时,不能放弃当前帧,因为这会危及代码标识安全。 因此,.NET Framework安全检查可能会导致 tail
被忽略,并留下标准Call指令。 同样,为了允许在调用返回后退出同步区域, tail
当用于退出标记为“已同步”的方法时,将忽略前缀。
以下 Emit 方法重载可以使用 tail
操作码: