OpCodes.Tailcall Pole
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Provádí příponu metody volání instrukce tak, že aktuální metoda zásobníku rámec je odstraněna před provedením skutečného volání instrukce.
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
Hodnota pole
Poznámky
Následující tabulka uvádí šestnáctkový formát sestavení instrukce a formát sestavení MSIL (Microsoft Intermediate Language) spolu se stručným přehledem referencí:
Formát | Formát sestavení | Description |
---|---|---|
FE 14 | Ocas. | Následné volání ukončí aktuální metody. |
Pro tuto instrukci není definováno žádné chování přechodu zásobníku.
Instrukce tail
předpony musí bezprostředně předcházet instrukcím Call, Callinebo Callvirt . Označuje, že rámec zásobníku aktuální metody by měl být před provedením instrukce volání odebrán. Také to znamená, že hodnota vrácená z následujícího volání je také hodnota vrácená aktuální metodou, a proto volání lze převést na přechod mezi metodami.
Zásobník musí být prázdný s výjimkou argumentů přenášených následujícím voláním. Instrukce následující za pokynem volání musí být ret. Jedinou platnou sekvencí kódu je tail. call
tedy (nebo calli
callvirt
). Správné instrukce jazyka MSIL (Microsoft Intermediate Language) se nesmí rozvětvovat na call
instrukci, ale můžou se rozvětvovat na následující Retpříkaz .
Aktuální rámec nelze zahodit při přenosu ovládacího prvku z nedůvěryhodného kódu do důvěryhodného kódu, protože by to ohrozilo zabezpečení identity kódu. Kontroly zabezpečení rozhraní .NET Framework proto mohou způsobit tail
ignorování a ponechat standardní Call instrukce. Podobně, aby po návratu volání mohlo dojít k ukončení synchronizované oblasti, tail
je předpona ignorována při použití k ukončení metody, která je označena jako synchronizovaná.
Následující Emit přetížení metody může použít tail
opcode: