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
ptr
se nasdílí do zásobníku. Typptr
musí být spravovaný ukazatel (&
)thisType
. Všimněte si, že se to liší od případu neopravenécallvirt
instrukce, která očekává odkazthisType
.Argumenty metody
arg1
prostřednictvímargN
se 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 callvirt
method
instrukce má předponu constrained
thisType
, instrukce se provede následujícím způsobem:
Pokud je
thisType
referenčním typem (na rozdíl od typu hodnoty),ptr
se předá a předá jako "tento" ukazatel nacallvirt
method
.Pokud je
thisType
typ hodnoty athisType
implementujemethod
,ptr
se předá jako ukazatel "tento" nacall
method
instrukce, pro implementacimethod
thisType
.Pokud
thisType
je typ hodnoty athisType
neimplementujemethod
pakptr
je dereferenced, boxed a předán jako "tento" ukazatel nacallvirt
method
instrukce.
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, call
V.ToString()
instrukce se vygeneruje; pokud ne, box
instrukce a callvirt
Object.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: