OpCodes.Tailcall Campo

Definição

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:

Aplica-se a