OpCodes.Readonly Mező

Definíció

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:

  1. 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, így readonly ebben az esetben no-op.

  2. 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ó:

  • object Az , ldfld, ldfldastfld, vagycall utasítások paraméterekéntconstrained callvirt.

  • pointer Az utasítás vagy az utasítások egyikének ldobj paraméterekéntldind.

  • source Az 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:

A következőre érvényes: