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
(или calli
callvirt
). Правильные инструкции MSIL не должны ветвляться в инструкцию call
, но они могут ветвиться в последующий Ret.
Текущий кадр нельзя отменить при передаче элемента управления из ненадежного кода в доверенный, так как это может поставить под угрозу безопасность удостоверений кода. Поэтому платформа .NET Framework проверок безопасности может привести tail
к игнорированию, оставляя стандартную Call инструкцию. Аналогичным образом, чтобы разрешить выход синхронизированной области после возврата вызова, tail
префикс игнорируется при выходе из метода, помеченного как синхронизированный.
Emit Следующая перегрузка tail
метода может использовать код операции: