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
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í:
Spravovaný ukazatel se
ptrnasdílí do zásobníku. Typptrmusí být spravovaným ukazatelem (&) nathisType. Všimněte si, že se to liší od případu neprefixovanécallvirtinstrukce, která očekává odkaz nathisType.Argumenty
arg1metody jsouargNvloženy do zásobníku stejně jako u nezafixovanécallvirtinstrukce.
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
thisTypeodkaz typu (na rozdíl od typu hodnoty), jeptrdereferenced a předán jako "tento" ukazatel nacallvirthodnotumethod.Pokud
thisTypeje typ hodnoty athisTypeimplementujemethod, jeptrpředána nezměněna jako "tento" ukazatel nacallmethodinstrukce, pro implementacimethodbythisType.Pokud
thisTypeje typ hodnoty athisTypeneimplementujemethod, jeptrdereferenced, 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 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: