OpCodes.Constrained Fält

Definition

Begränsar vilken typ av anrop av virtuell metod som görs.

public: static initonly System::Reflection::Emit::OpCode Constrained;
public static readonly System.Reflection.Emit.OpCode Constrained;
 staticval mutable Constrained : System.Reflection.Emit.OpCode
Public Shared ReadOnly Constrained As OpCode 

Fältvärde

Kommentarer

I följande tabell visas instruktionens sammansättningsformat för hexadecimalt och Microsoft mellanliggande språk (MSIL), tillsammans med en kort referenssammanfattning:

Format Sammansättningsformat Description
FE 16 <T> Begränsad. thisType Anropa en virtuell metod för en typ som är begränsad till typen T.

Prefixet constrained tillåts endast på en callvirt instruktion.

MsIL-stackens tillstånd måste nu vara följande:

  1. En hanterad pekare, ptr, skickas till stacken. Typen av ptr måste vara en hanterad pekare (&) till thisType. Observera att detta skiljer sig från fallet med en inaktuell callvirt instruktion, som förväntar sig en referens till thisType.

  2. Metodargument arg1 skickas till argN stacken, precis som med en inaktuell callvirt instruktion.

Prefixet constrained är utformat för att tillåta callvirt att instruktioner görs på ett enhetligt sätt oberoende av om thisType det är en värdetyp eller en referenstyp.

När en callvirtmethod instruktion har prefixats av constrainedthisTypekörs instruktionen på följande sätt:

  • Om thisType är en referenstyp (till skillnad från en värdetyp) ptr derefereras och skickas som pekaren "den här" till callvirt i method.

  • Om thisType är en värdetyp och thisType implementeras skickas methodptr den oförändrade som den här pekaren till en callmethod instruktion, för implementeringen av method av thisType.

  • Om thisType är en värdetyp och thisType inte implementeras methodptr så derefereras, boxas och skickas som den här pekaren till instruktionen callvirtmethod .

Det sista fallet kan endast inträffa när method har definierats för Object, ValueTypeeller och Enum inte åsidosätts av thisType. I det här fallet gör boxningen att en kopia av det ursprungliga objektet görs. Men eftersom ingen av metoderna för Object, ValueTypeoch Enum ändrar objektets tillstånd, kan det här faktumet inte identifieras.

Prefixet constrained stöder IL-generatorer som skapar allmän kod. Normalt är instruktionen callvirt inte giltig för värdetyper. I stället krävs det att IL-kompilatorer effektivt utför den "här" transformering som beskrivs ovan vid kompileringstillfället, beroende på vilken typ av ptr och vilken metod som anropas. Men när ptr är en allmän typ som är okänd vid kompileringstid är det inte möjligt att göra den här omvandlingen vid kompileringstillfället.

Med constrained opcode kan IL-kompilatorer göra ett anrop till en virtuell funktion på ett enhetligt sätt oberoende av om ptr det är en värdetyp eller en referenstyp. Även om det är avsett för det fall där thisType är en allmän typvariabel, fungerar prefixet constrained även för icke-generiska typer och kan minska komplexiteten i att generera virtuella anrop på språk som döljer skillnaden mellan värdetyper och referenstyper.

Med prefixet constrained undviker du också potentiella versionsproblem med värdetyper. Om prefixet constrained inte används måste olika IL genereras beroende på om en värdetyp åsidosätter en metod för System.Object. Om en värdetyp V till exempel åsidosätter metoden Object.ToString() genereras encallV.ToString()instruktion. Om den inte gör det genereras en box instruktion och en callvirtObject.ToString() instruktion. Ett versionsproblem kan uppstå i det tidigare fallet om åsidosättningen senare tas bort och i det senare fallet om en åsidosättning läggs till senare.

Prefixet constrained kan också användas för anrop av gränssnittsmetoder för värdetyper, eftersom metoden för värdetyp som implementerar gränssnittsmetoden kan ändras med hjälp av en MethodImpl. Om prefixet constrained inte används tvingas kompilatorn välja vilken av värdetypens metoder som ska bindas till vid kompileringstillfället. Med prefixet constrained kan MSIL binda till den metod som implementerar gränssnittsmetoden vid körning i stället för vid kompilering.

Följande Emit metodöverlagring kan använda constrained opcode:

Gäller för