OpCodes.Constrained Mező
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
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:
A rendszer egy felügyelt mutatót
ptrküld a verembe. A típusnakptrfelügyelt mutatónak (&)thisTypekell lennie. Vegye figyelembe, hogy ez eltér a nem előre megadottcallvirtutasítások esetétől, amely a következőre fog hivatkoznithisType: .A metódusargumentumok
arg1aargNverembe kerülnek, csakúgy, mint az előre nem illesztettcallvirtutasí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
thisTypehivatkozási típus (nem értéktípus), akkorptra függvény dereferens lesz, és "ez" mutatóként adja át acallvirtkövetkezőhözmethod: .Ha
thisTypeegy értéktípus ésthisTypeimplementáció,methodakkorptra rendszer az "ez" mutatót módosítva adja át egycallmethodutasításnak a végrehajtáshozmethodthisType.Ha
thisTypeértéktípus, ésthisTypenem implementálódikmethod, akkorptra függvény halasztja, bekeretezi, és "ez" mutatóként továbbítja azcallvirtmethodutasí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: