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

V následující tabulce je uveden šestnáctkový formát sestavení jazyka MSIL (hexadecimal a Microsoft intermediate language) a stručný přehled referenčních informací:

Formát Formát sestavení Description
FE 16 <T> Omezeny. 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 se ptrnasdílí do zásobníku. Typ ptr musí být spravovaným ukazatelem (&) na thisType. Všimněte si, že se to liší od případu neprefixované callvirt instrukce, která očekává odkaz na thisType.

  2. Argumenty arg1 metody jsou argN vloženy do zásobníku stejně jako u nezafixované callvirt instrukce.

Předpona constrained je navržená tak, aby callvirt umožňovala vytvoření instrukcí jednotným způsobem nezávisle na tom, zda thisType je typ hodnoty nebo odkazový typ.

Pokud má instrukce předponu callvirtmethodconstrainedthisType, instrukce se provede následujícím způsobem:

  • Je-li thisType odkaz typu (na rozdíl od typu hodnoty), je ptr dereferenced a předán jako "tento" ukazatel na callvirt hodnotu method.

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

  • Pokud thisType je typ hodnoty a thisType neimplementuje method , je ptr 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 byl definován na Object, ValueTypenebo Enum a není přepsán .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 upravit stav objektu, nelze tuto skutečnost rozpoznat.

Předpona constrained podporuje generátory IL, které vytvářejí obecný kód. callvirt Instrukce 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 ptr je však 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 odkazový typ. I když je určen pro případ, kdy thisType je proměnná obecného typu, constrained předpona také funguje pro negenerické typy a může snížit složitost generování virtuálních volání v jazycích, které skrývají rozdíl mezi typy hodnot a odkazovými typy.

Použití předpony constrained také zabraňuje potenciálním problémům se správou verzí s typy 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 V hodnoty přepíše Object.ToString() metoda, callV.ToString() vygeneruje se instrukce, 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í.

Předponu constrained lze také použít pro vyvolání metod rozhraní u typů hodnot, protože metoda typu hodnoty implementuje metodu MethodImplrozhraní lze změnit pomocí . constrained Pokud se předpona 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 nikoli v době kompilace.

Emit Následující přetížení metody může použít constrained opcode:

Platí pro