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 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í:
Do zásobníku se nasdílí spravovaný ukazatel
ptr
. Typptr
musí být spravovaný ukazatel (&
) nathisType
. Všimněte si, že se jedná o něco jiného než u předepisovanécallvirt
instrukce, která očekává odkazthisType
na .Argumenty
arg1
metody jsouargN
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á callvirt
method
instrukce předponu constrained
thisType
, provede se instrukce následujícím způsobem:
Pokud
thisType
je typ odkazu (na rozdíl od typu hodnoty), pakptr
se předeferencuje a předá se jako ukazatel "this" nacallvirt
method
typ .Pokud
thisType
je typ hodnoty athisType
implementujemethod
, pakptr
je předán beze změny jako "this" ukazatel nacall
method
instrukci, pro implementacimethod
pomocíthisType
.Pokud
thisType
je typ hodnoty athisType
neimplementujemethod
, pakptr
je dereferenced, boxed a předán jako "this" ukazatel nacallvirt
method
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, call
V.ToString()
je generována instrukce; pokud ne, box
instrukce a callvirt
Object.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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro