Sdílet prostřednictvím


OpCodes.Constrained Pole

Definice

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í:

  1. Spravovaný ukazatel ptrse nasdílí do zásobníku. Typ ptr musí být spravovaný ukazatel (&) thisType. Všimněte si, že se to liší od případu neopravené callvirt instrukce, která očekává odkaz thisType.

  2. Argumenty metody arg1 prostřednictvím argN se nasdílí do zásobníku stejně jako u nezafixované instrukce callvirt.

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 thisType referenčním typem (na rozdíl od typu hodnoty), ptr se předá a předá jako "tento" ukazatel na callvirtmethod.

  • Pokud je thisType typ hodnoty a thisType implementuje method, ptr se předá jako ukazatel "tento" na callmethod instrukce, pro implementaci methodthisType.

  • Pokud thisType je typ hodnoty a thisType neimplementuje method pak ptr je dereferenced, boxed a předán jako "tento" ukazatel na callvirtmethod 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, 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:

Platí pro