OpCodes.Constrained Fält
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
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:
En hanterad pekare,
ptr, skickas till stacken. Typen avptrmåste vara en hanterad pekare (&) tillthisType. Observera att detta skiljer sig från fallet med en inaktuellcallvirtinstruktion, som förväntar sig en referens tillthisType.Metodargument
arg1skickas tillargNstacken, precis som med en inaktuellcallvirtinstruktion.
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)ptrderefereras och skickas som pekaren "den här" tillcallvirtimethod.Om
thisTypeär en värdetyp ochthisTypeimplementeras skickasmethodptrden oförändrade som den här pekaren till encallmethodinstruktion, för implementeringen avmethodavthisType.Om
thisTypeär en värdetyp ochthisTypeinte implementerasmethodptrså derefereras, boxas och skickas som den här pekaren till instruktionencallvirtmethod.
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: