OpCodes.Readonly 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í.
Určuje, že následná operace adresy pole neprovádí žádnou kontrolu typu za běhu a že vrací spravovaný ukazatel, jehož proměnlivost je omezená.
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
Hodnota pole
Poznámky
V následující tabulce je uveden šestnáctkový formát sestavení jazyka MSIL (hexadecimal a Microsoft intermediate language) a stručný přehled referenčních informací:
| Formát | Formát sestavení | Description |
|---|---|---|
| FE 1E | pouze pro čtení. | Určete, že následná operace adresy pole neprovádí žádnou kontrolu typu za běhu a že vrací spravovaný ukazatel s omezenou proměnlivostí. |
Tato předpona se může zobrazit pouze bezprostředně před ldelema instrukcí a volání speciální Address metody v polích. Jeho účinek na následující operaci je dvojí:
V době běhu se neprovádí žádná operace kontroly typu. Všimněte si, že při použití polí referenčního typu obvykle existuje implicitní kontrola
ldelematypu astelempokyny. Nikdy neexistuje kontrola hodnotových tříd typu za běhu, takžereadonlyje to no-op v takovém případě.Ověřovatel považuje výsledek operace adresy za spravovaný ukazatel s omezenou proměnlivostí.
Ukazatel se říká, že má omezenou mutovatelnost, protože definující typ určuje, zda je možné hodnotu ztlumit. Pro třídy hodnot, které nezpřístupňují žádná veřejná pole nebo metody, které aktualizují hodnotu na místě, je ukazatel jen pro čtení (proto název předpony). Konkrétně třídy představující primitivní typy (například System.Int32) nezpřístupňují mutátory, a proto jsou jen pro čtení.
Spravovaný ukazatel omezený tímto způsobem lze použít pouze následujícími způsoby:
objectJako parametr proldfldpříkaz ,ldflda,stfldcall, neboconstrained callvirtinstrukce.pointerJako parametr instrukceldobjnebo některého zldindpokynů.sourceJako parametr instrukcecpobj.
Všechny ostatní operace se nepovolily, včetně stobjoperací , nebo initobj operací nebo jakékoli instrukce mkrefanystind.
Účelem předpony readonly je vyhnout se kontrole typu při načítání elementu z pole v obecném kódu. Například výraz arr[i].m(), kde typ prvku pole arr je obecný typ, který byl omezen na rozhraní s metodou m, může zkompilovat do následující jazyk MSIL.
ldloc arr
ldloc i
readonly.
ldelema !0 // Loads the pointer to the object.
… // Load the arguments to the call.
constrained. !0
callvirt m
readonly Bez předpony ldelema by instrukce prováděla kontrolu typu v případě, že !0 byl typ odkazu. Tento typ kontroly je nejen neefektivní, ale je to sémanticky nesprávné. Kontrola typu ldelema je přesná shoda, která je příliš silná. Pokud pole drží podtřídy typu !0, výše uvedený kód by selžel kontrolu typu.
Adresa prvku pole se načte místo samotného prvku, aby měl popisovač, který funguje pro arr[i] oba typy hodnot i odkazové typy, a proto lze předat constrained callvirt instrukce.
Obecně by bylo nebezpečné přeskočit kontrolu doby běhu, pokud pole obsahuje prvky referenčního typu. Chcete-li být v bezpečí, je nutné zajistit, aby prostřednictvím tohoto ukazatele nebyly provedeny žádné změny pole. Tato pravidla ověřovače zajišťují. Omezený spravovaný ukazatel lze předat jako objekt volání metody instance, takže není přísně určen jen pro čtení pro typy hodnot, ale neexistuje žádný problém zabezpečení typu pro typy hodnot.
Emit Následující přetížení metody může použít readonly opcode: