OpCodes.Readonly 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.
Megadja, hogy az ezt követő tömbcímművelet futásidőben nem végez típusellenőrzést, és egy olyan felügyelt mutatót ad vissza, amelynek a módosíthatósága korlátozott.
public: static initonly System::Reflection::Emit::OpCode Readonly;
public static readonly System.Reflection.Emit.OpCode Readonly;
staticval mutable Readonly : System.Reflection.Emit.OpCode
Public Shared ReadOnly Readonly 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 1E | Olvasható. | Adja meg, hogy az ezt követő tömbcímművelet futásidőben nem végez típusellenőrzést, és hogy korlátozottan módosítható felügyelt mutatót ad vissza. |
Ez az előtag csak közvetlenül az ldelema utasítás előtt jelenhet meg, és meghívja a tömbök speciális Address metódusát. A következő műveletre gyakorolt hatása kettős:
Futásidőben a rendszer nem hajt végre típusellenőrzési műveletet. Vegye figyelembe, hogy a referencia típusú tömbökben általában implicit típusellenőrzést
ldelemastelemés utasításokat használnak. Az értékosztályok futásidejű típusának ellenőrzése soha nem történik meg, ígyreadonlyebben az esetben no-op.A hitelesítő a művelet címének eredményét korlátozottan módosítható felügyelt mutatóként kezeli.
Az egérmutató korlátozottan módosítható, mert a definiáló típus szabályozza, hogy az érték módosítható-e. Az olyan értékosztályok esetében, amelyek nem fednek fel nyilvános mezőket vagy metódusokat, amelyek frissítik az értéket, az egérmutató írásvédett (tehát az előtag neve). A primitív típusokat (például System.Int32) képviselő osztályok nem tesznek közzé mutációkat, ezért írásvédettek.
Az ilyen módon korlátozott felügyelt mutató csak a következő módokon használható:
objectAz ,ldfld,ldfldastfld, vagycallutasítások paraméterekéntconstrained callvirt.pointerAz utasítás vagy az utasítások egyikénekldobjparaméterekéntldind.sourceAz utasítás paraméterekéntcpobj.
Minden más művelet nem engedélyezett, beleértve a stobj, , initobjvagy mkrefany műveletek, vagy bármely stind utasítást.
Az előtag célja, hogy elkerülje a readonly típusellenőrzést egy elem általános kódban lévő tömbből való lekérésekor. Előfordulhat például, hogy a kifejezés arr[i].m(), ahol a tömb arr elemtípusa egy általános típus, amely a metódushoz mvaló kapcsolódásra van korlátozva, a következő MSIL-be fordítható.
ldloc arr
ldloc i
readonly.
ldelema !0 // Loads the pointer to the object.
… // Load the arguments to the call.
constrained. !0
callvirt m
Az readonly előtag nélkül az ldelema utasítás típusellenőrzést végez abban az esetben, ha a(z) !0 referenciatípus volt. Ez a típus nem csak nem hatékony, de szemantikailag helytelen is. A típusellenőrzés ldelema pontos egyezés, ami túl erős. Ha a tömb a(z) !0 típusú alosztályokat birtokolja, a fenti kód nem felel meg a típusellenőrzésnek.
A tömbelem címét az elem helyett a rendszer lekéri, hogy legyen egy leírója arr[i] , amely az értéktípusokhoz és a referenciatípusokhoz egyaránt használható, és így átadható az constrained callvirt utasításnak.
Általában nem biztonságos kihagyni a futásidejű ellenőrzést, ha a tömb hivatkozástípusú elemeket tartalmaz. A biztonság érdekében gondoskodni kell arról, hogy ezen a mutatón keresztül ne történjen módosítás a tömbön. Ezt a hitelesítő szabályok biztosítják. A korlátozott felügyelt mutató átadható a példánymetódus-hívások objektumaként, így az értéktípusok esetében nem kimondottan írásvédett, de az értéktípusok esetében nincs típusbiztonsági probléma.
A következő Emit metódus túlterhelése használhatja az readonly opcode-ot: