Sdílet prostřednictvím


OpCodes.Constrained Pole

Definice

Omezuje typ 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 (Microsoft Intermediate Language) spolu se stručným referenčním shrnutím:

Formát Formát sestavení Description
FE 16 <T> Omezeny. thisType Volání virtuální metody pro typ omezené na typ T.

Předpona constrained je povolena pouze u callvirt instrukce.

Stav zásobníku jazyka MSIL v tomto okamžiku musí být následující:

  1. Do zásobníku se nasdílí spravovaný ukazatel ptr. Typ ptr musí být spravovaný ukazatel (&) na thisType. Všimněte si, že se jedná o něco jiného než u předepisované callvirt instrukce, která očekává odkaz thisTypena .

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

Předpona je navržena constrained tak, aby umožňovala callvirt provádět instrukce jednotným způsobem nezávisle na tom, zda thisType je typ hodnoty nebo typ odkazu.

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

  • Pokud thisType je typ odkazu (na rozdíl od typu hodnoty), pak ptr se předeferencuje a předá se jako ukazatel "this" na callvirtmethodtyp .

  • Pokud thisType je typ hodnoty a thisType implementuje method , pak ptr je předán beze změny jako "this" ukazatel na callmethod instrukci, pro implementaci method pomocí thisType.

  • Pokud thisType je typ hodnoty a thisType neimplementuje method , pak ptr je dereferenced, boxed a předán jako "this" ukazatel na callvirtmethod instrukci.

K tomuto poslednímu případu může dojít pouze v případě, ValueTypeže method byl definován na Object, nebo Enum a nepřepsal ho thisType. V tomto případě boxování způsobí vytvoření kopie původního objektu. Vzhledem k tomu, že žádná z metod Object, ValueTypea Enum nemění stav objektu, nelze tuto skutečnost zjistit.

Předpona constrained podporuje generátory IL, které vytvářejí obecný kód. Za normálních okolností callvirt není instrukce platná pro hodnotové typy. Místo toho je nutné, aby kompilátory IL efektivně prováděly transformaci "this" popsanou výše 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 provést volání virtuální funkce jednotným způsobem nezávisle na tom, zda ptr je typ hodnoty nebo odkaz typu. I když je předpona určená pro případ, že thisType jde o proměnnou obecného typu, constrained funguje také 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 hodnotovými typy a odkazovými typy.

Použitím předpony constrained se také vyhnete potenciálním problémům se správou verzí u typů hodnot. Pokud předpona constrained není použita, musí se vysílat jiné il v závislosti na tom, jestli typ hodnoty přepíše metodu System.Object. Například pokud typ V hodnoty přepíše Object.ToString() metoda, callV.ToString() je generována instrukce; pokud ne, box instrukce a callvirtObject.ToString() instrukce jsou generovány. V prvním případě může dojít k problému se správou verzí, pokud je přepsání později odebráno a v druhém případě, pokud je přepsání přidáno později.

Předponu constrained lze také použít pro vyvolání metod rozhraní u typů hodnot, protože metodu hodnotového typu implementujte metodu rozhraní lze změnit pomocí MethodImpl. Pokud předpona constrained není použita, je kompilátor nucen zvolit, který z metod typu hodnoty se má svázat v době kompilace. Použití předpony constrained umožňuje jazyku MSIL vytvořit vazbu na metodu, která implementuje metodu rozhraní za běhu, nikoli v době kompilace.

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

Platí pro