OpCodes.Constrained 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í.
Omezuje typ, na kterém se provádí volání virtuální metody.
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
Hodnota pole
Poznámky
Následující tabulka uvádí šestnáctkový formát sestavení jazyka MSIL (Microsoft Intermediate Language) a stručný přehled referenčních informací:
| Formát | Formát sestavení | Popis |
|---|---|---|
FE 16 <T> |
přinucený. thisType |
Volání virtuální metody u typu omezeného na typ T. |
Předpona constrained je povolená pouze u callvirt instrukce.
Stav zásobníku MSIL v tomto okamžiku musí být následující:
Spravovaný ukazatel
ptrse nasdílí do zásobníku. Typptrmusí být spravovaný ukazatel (&)thisType. Všimněte si, že se to liší od případu neopravenécallvirtinstrukce, která očekává odkazthisType.Argumenty metody
arg1prostřednictvímargNse nasdílí do zásobníku stejně jako u nezafixované instrukcecallvirt.
Předpona constrained je navržená tak, aby umožňovala, aby callvirt instrukce byly provedeny jednotným způsobem nezávisle na tom, zda thisType je typ hodnoty nebo typ odkazu.
Pokud callvirtmethod instrukce má předponu constrainedthisType, instrukce se provede následujícím způsobem:
Pokud je
thisTypereferenčním typem (na rozdíl od typu hodnoty),ptrse předá a předá jako "tento" ukazatel nacallvirtmethod.Pokud je
thisTypetyp hodnoty athisTypeimplementujemethod,ptrse předá jako ukazatel "tento" nacallmethodinstrukce, pro implementacimethodthisType.Pokud
thisTypeje typ hodnoty athisTypeneimplementujemethodpakptrje dereferenced, boxed a předán jako "tento" ukazatel nacallvirtmethodinstrukce.
K tomuto poslednímu případu může dojít pouze v případě, že method byla definována v Object, ValueTypenebo Enum a nebyla přepsána thisType. V tomto případě boxing způsobí vytvoření kopie původního objektu. Vzhledem k tomu, že žádná z metod Object, ValueTypea Enum změnit stav objektu, nelze tuto skutečnost rozpoznat.
Předpona constrained podporuje generátory IL, které vytvářejí obecný kód. Instrukce callvirt obvykle není platná pro typy hodnot. Místo toho je nutné, aby kompilátory IL efektivně prováděly výše uvedenou transformaci v době kompilace v závislosti na typu ptr a volané metodě. Pokud je však ptr obecný typ, který je v době kompilace neznámý, není možné tuto transformaci provést v době kompilace.
Opcode constrained umožňuje kompilátorům IL volat virtuální funkci jednotným způsobem nezávisle na tom, zda ptr je typ hodnoty nebo typ odkazu. I když je určen pro případ, kdy thisType je proměnná obecného typu, předpona constrained funguje také pro negenerické typy a může snížit složitost generování virtuálních volání v jazycích, které skryjí rozdíl mezi typy hodnot a odkazovými typy.
Použití předpony constrained také zabraňuje potenciálním problémům s verzí u typů hodnot. Pokud se předpona constrained nepoužívá, musí být v závislosti na tom, zda typ hodnoty přepíše metodu System.Object. Pokud například typ hodnoty V přepíše Object.ToString() metoda, callV.ToString() instrukce se vygeneruje; pokud ne, box instrukce a callvirtObject.ToString() instrukce se vygenerují. V případě pozdějšího odebrání přepsání může dojít k problému s verzí a v druhém případě v případě pozdějšího přidání přepsání.
constrained předponu lze také použít k vyvolání metod rozhraní u typů hodnot, protože metoda typu hodnoty implementuje metodu rozhraní lze změnit pomocí MethodImpl. Pokud se předpona constrained nepoužívá, kompilátor je nucen zvolit, ke které z metod typu hodnoty se mají v době kompilace svázat. Použití předpony constrained umožňuje rozhraní MSIL svázat s metodou, která implementuje metodu rozhraní za běhu, a ne v době kompilace.
Následující přetížení metody Emit může použít constrained opcode: