Поделиться через


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 

Значение поля

Комментарии

В следующей таблице приведен шестнадцатеричный формат инструкции и формат сборки MSIL, а также краткая справочная сводка:

Формат Формат сборки Описание
FE 14 Хвост. Последующий вызов завершает текущие методы

Для этой инструкции не определено поведение перехода стека.

Префиксная tail инструкция должна непосредственно предшествовать инструкции Call, Calliили Callvirt . Он указывает, что фрейм стека текущего метода должен быть удален перед выполнением инструкции вызова. Это также подразумевает, что значение, возвращаемое при следующем вызове, также является значением, возвращаемым текущим методом, и поэтому вызов может быть преобразован в переход между методами.

Стек должен быть пустым, за исключением аргументов, передаваемых при следующем вызове. Инструкция, следующая за инструкцией вызова, должна быть ret. Таким образом, единственной допустимой последовательностью кода является tail. call (или callicallvirt). Правильные инструкции MSIL не должны ветвляться в инструкцию call , но они могут ветвиться в последующий Ret.

Текущий кадр нельзя отменить при передаче элемента управления из ненадежного кода в доверенный, так как это может поставить под угрозу безопасность удостоверений кода. Поэтому платформа .NET Framework проверок безопасности может привести tail к игнорированию, оставляя стандартную Call инструкцию. Аналогичным образом, чтобы разрешить выход синхронизированной области после возврата вызова, tail префикс игнорируется при выходе из метода, помеченного как синхронизированный.

Emit Следующая перегрузка tail метода может использовать код операции:

Применяется к