Condividi tramite


OpCodes.Tailcall Campo

Definizione

Esegue un'istruzione di chiamata al metodo con suffisso tale da rimuovere lo stack frame del metodo corrente prima dell'esecuzione dell'istruzione di chiamata effettiva.

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 

Valore del campo

Commenti

La tabella seguente elenca il formato dell'assembly esadecimale e Microsoft Intermediate Language (MSIL), insieme a un breve riepilogo di riferimento:

Formato Formato assembly Descrizione
FE 14 Coda. La chiamata successiva termina i metodi correnti

Non esiste alcun comportamento di transizione dello stack definito per questa istruzione.

L'istruzione tail prefisso deve precedere immediatamente un'istruzione Call, Callio Callvirt . Indica che il frame dello stack del metodo corrente deve essere rimosso prima dell'esecuzione dell'istruzione di chiamata. Implica anche che il valore restituito dalla chiamata seguente è anche il valore restituito dal metodo corrente e la chiamata può quindi essere convertita in un salto tra metodi.

Lo stack deve essere vuoto, ad eccezione degli argomenti trasferiti dalla chiamata seguente. L'istruzione che segue l'istruzione di chiamata deve essere un tentativo. Pertanto, l'unica sequenza di codice valida è tail. call (o callicallvirt). Le istruzioni di Microsoft Intermediate Language (MSIL) corrette non devono eseguire il ramo all'istruzione call , ma possono eseguire il ramo al successivo Ret.

Il frame corrente non può essere rimosso quando il controllo viene trasferito dal codice non attendibile al codice attendibile, poiché ciò comprometterebbe la sicurezza dell'identità del codice. I controlli di sicurezza di .NET Framework possono quindi causare l'ignorare tail , lasciando un'istruzione standard Call . Analogamente, per consentire all'uscita di un'area sincronizzata di verificarsi dopo il ritorno della chiamata, il tail prefisso viene ignorato quando viene usato per uscire da un metodo contrassegnato come sincronizzato.

L'overload del metodo seguente Emit può usare il tail codice opcode:

Si applica a