OpCodes.Tailcall 字段

定义

执行后缀的方法调用指令,以便在执行实际调用指令前移除当前方法的堆栈帧。

public static readonly System.Reflection.Emit.OpCode Tailcall;

字段值

注解

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

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

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

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

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

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

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

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0