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)組合格式,並附有簡短參考摘要:
| Format | 組裝格式 | Description |
|---|---|---|
| FE 14 | 尾巴。 | 後續呼叫終止目前的方法 |
此指令未定義堆疊轉換行為。
tail前綴指令必須緊Call接在 、 Calli或 Callvirt 指令之前。 它表示在執行呼叫指令前,應該先移除目前方法的堆疊框架。 這也意味著下一次呼叫回傳的值同時也是當前方法回傳的值,因此呼叫可以轉換成跨方法跳躍。
堆疊必須為空,僅有下一呼叫所傳輸的參數。 呼叫指令後的指令必須是 ret。因此唯一有效的碼序列是 tail. call (或 callicallvirt或 )。 正確的Microsoft中級語言(MSIL)指令不得分支到call指令,但可以分支到後續的Ret。
當控制權從不可信程式碼轉移到可信程式碼時,當前幀無法被丟棄,因為這會危及程式碼身份安全。 因此,.NET Framework 的安全檢查可能導致忽略 tail,留下標準的 Call 指令。 同樣地,為了讓同步區域在呼叫返回 tail 後退出,當用於退出標記為同步的方法時,前綴會被忽略。
以下 Emit 方法的超載可使用操作 tail 碼: