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前綴指令必須緊Call接在 、 CalliCallvirt 指令之前。 它表示在執行呼叫指令前,應該先移除目前方法的堆疊框架。 這也意味著下一次呼叫回傳的值同時也是當前方法回傳的值,因此呼叫可以轉換成跨方法跳躍。

堆疊必須為空,僅有下一呼叫所傳輸的參數。 呼叫指令後的指令必須是 ret。因此唯一有效的碼序列是 tail. call (或 callicallvirt或 )。 正確的Microsoft中級語言(MSIL)指令不得分支到call指令,但可以分支到後續的Ret

當控制權從不可信程式碼轉移到可信程式碼時,當前幀無法被丟棄,因為這會危及程式碼身份安全。 因此,.NET Framework 的安全檢查可能導致忽略 tail,留下標準的 Call 指令。 同樣地,為了讓同步區域在呼叫返回 tail 後退出,當用於退出標記為同步的方法時,前綴會被忽略。

以下 Emit 方法的超載可使用操作 tail 碼:

適用於