OpCodes.Tailcall Campo
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Executa uma instrução de chamada de método pós-fixada, de modo que o registro de ativação do método atual é removido antes da execução da instrução de chamada real.
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
Valor do campo
Comentários
A tabela a seguir lista o formato de assembly hexadecimal e MSIL (Microsoft Intermediate Language) da instrução, juntamente com um breve resumo de referência:
Formatar | Formato de assembly | Descrição |
---|---|---|
FE 14 | Cauda. | A chamada subsequente encerra os métodos atuais |
Não há nenhum comportamento de transição de pilha definido para esta instrução.
A tail
instrução de prefixo deve preceder imediatamente uma Callinstrução , Calliou Callvirt . Indica que o registro de pilha do método atual deve ser removido antes que a instrução de chamada seja executada. Isso também implica que o valor retornado da chamada a seguir também é o valor retornado pelo método atual e, portanto, a chamada pode ser convertida em um salto entre métodos.
A pilha deve estar vazia, exceto pelos argumentos que estão sendo transferidos pela chamada a seguir. A instrução após a instrução de chamada deve ser um ret. Portanto, a única sequência de código válida é tail. call
(ou calli
ou callvirt
). As instruções corretas da MSIL (Linguagem Intermediária da Microsoft) não devem se ramificar para a call
instrução , mas podem ramificar-se para o subsequente Ret.
O quadro atual não pode ser descartado quando o controle é transferido de código não confiável para código confiável, pois isso comprometeria a segurança de identidade de código. O .NET Framework verificações de segurança pode, portanto, fazer com que o tail
seja ignorado, deixando uma instrução padrãoCall. Da mesma forma, para permitir que a saída de uma região sincronizada ocorra após o retorno da chamada, o tail
prefixo é ignorado quando usado para sair de um método marcado como sincronizado.
Emit A seguinte sobrecarga de método pode usar o tail
opcode: