OpCodes.Constrained Mező

Definíció

Korlátozza a virtuális metódus hívásának típusát.

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 

Mező értéke

Megjegyzések

Az alábbi táblázat felsorolja az utasítás hexadecimális és Microsoft köztes nyelv (MSIL) szerelvényformátumát, valamint egy rövid összefoglalást:

Format Szerelvény formátuma Leírás
FE 16 <T> Korlátozott. thisType Virtuális metódus meghívása olyan típuson, amely típusra Tvan korlátozva.

Az constrained előtag csak utasításban callvirt engedélyezett.

Az MSIL-verem állapotának ezen a ponton a következőnek kell lennie:

  1. A rendszer egy felügyelt mutatót ptrküld a verembe. A típusnak ptr felügyelt mutatónak (&) thisTypekell lennie. Vegye figyelembe, hogy ez eltér a nem előre megadott callvirt utasítások esetétől, amely a következőre fog hivatkozni thisType: .

  2. A metódusargumentumok arg1 a argN verembe kerülnek, csakúgy, mint az előre nem illesztett callvirt utasítások.

Az constrained előtag úgy lett kialakítva, hogy az callvirt utasítások egységes módon legyenek megadva, függetlenül attól, hogy értéktípusról vagy referenciatípusról van-e thisType szó.

Ha egy callvirtmethod utasítás előtaggal constrainedthisTyperendelkezik, az utasítás végrehajtása az alábbiak szerint történik:

  • Ha thisType hivatkozási típus (nem értéktípus), akkor ptr a függvény dereferens lesz, és "ez" mutatóként adja át a callvirt következőhöz method: .

  • Ha thisType egy értéktípus és thisType implementáció, method akkor ptr a rendszer az "ez" mutatót módosítva adja át egy callmethod utasításnak a végrehajtáshoz methodthisType.

  • Ha thisType értéktípus, és thisType nem implementálódik method , akkor ptr a függvény halasztja, bekeretezi, és "ez" mutatóként továbbítja az callvirtmethod utasításnak.

Ez az utolsó eset csak akkor fordulhat elő, ha method a beállítás be Objectlett állítva, ValueTypevagy Enum nem bírálta thisTypefelül a rendszer. Ebben az esetben a dobozolás az eredeti objektum másolatát okozza. Mivel azonban az objektum egyik metódusa ObjectValueTypesem, és Enum nem módosítja az objektum állapotát, ez a tény nem észlelhető.

Az constrained előtag támogatja az általános kódot létrehozó IL-generátorokat. Az utasítás általában callvirt nem érvényes értéktípusokra. Ehelyett az IL-fordítóknak ténylegesen végre kell hajtaniuk a fent vázolt "ez" átalakítást a fordításkor, a metódus típusától ptr és a meghívandó metódustól függően. Ha azonban olyan általános típusról van szó, ptr amely a fordításkor ismeretlen, akkor fordításkor nem lehet ezt az átalakítást elvégezni.

Az constrained opcode lehetővé teszi, hogy az IL-fordítók egységes módon hívjanak meg egy virtuális függvényt, függetlenül attól, hogy értéktípusról vagy referenciatípusról van-e ptr szó. Bár az általános típusú változók esetében thisType használható, az constrained előtag nemgenerikus típusok esetében is működik, és csökkentheti a virtuális hívások olyan nyelveken történő generálásának összetettségét, amelyek elrejtik az értéktípusok és a referenciatípusok közötti különbséget.

constrained Az előtag használata az értéktípusokkal kapcsolatos lehetséges verziószámozási problémákat is elkerüli. Ha az constrained előtagot nem használja, eltérő IL-t kell kibocsátani attól függően, hogy egy értéktípus felülírja-e a System.Object metódust. Ha például egy értéktípus V felülbírálja az Object.ToString() metódust, callV.ToString() a rendszer egy utasítást ad ki, ha nem, akkor utasítást box és utasítást callvirtObject.ToString() ad ki. A korábbi esetben verziószámozási probléma merülhet fel, ha a felülbírálást később eltávolítják, az utóbbi esetben pedig felülbírálás hozzáadásakor.

Az constrained előtag használható az interfészmetódusok értéktípusokon történő meghívására is, mivel az illesztőmetódust megvalósító értéktípus-metódus módosítható egy MethodImpl. Ha nem használja az constrained előtagot, a fordítónak ki kell választania, hogy az értéktípus melyik metódusához kell kapcsolódnia a fordításkor. constrained Az előtag használata lehetővé teszi az MSIL számára, hogy a fordítási idő helyett futásidőben kösse össze az interfészmetódus implementálását végrehajtó metódust.

A következő Emit metódus túlterhelése használhatja az constrained opcode-ot:

A következőre érvényes: