OpCodes.Readonly Fält
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Anger att den efterföljande matrisadressåtgärden inte utför någon typkontroll vid körning och att den returnerar en hanterad pekare vars föränderlighet är begränsad.
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
Fältvärde
Kommentarer
I följande tabell visas instruktionens sammansättningsformat för hexadecimalt och Microsoft mellanliggande språk (MSIL), tillsammans med en kort referenssammanfattning:
| Format | Sammansättningsformat | Description |
|---|---|---|
| FE 1E | Endast läsbart. | Ange att den efterföljande matrisadressåtgärden inte utför någon typkontroll vid körning och att den returnerar en hanterad pekare med begränsad föränderlighet. |
Det här prefixet kan bara visas direkt före instruktionen ldelema och anrop till specialmetoden Address för matriser. Dess effekt på den efterföljande åtgärden är dubbel:
Vid körning utförs ingen typkontrollåtgärd. Observera att det normalt finns en implicit typkontroll för
ldelemainstruktionerna ochstelemnär de används i referenstypmatriser. Det finns aldrig en körningstypkontroll för värdeklasser, såreadonlyär en no-op i så fall.Kontrollanten behandlar resultatet av åtgärdens adress som en hanterad pekare med begränsad föränderlighet.
Pekaren sägs ha begränsad föränderlighet eftersom den definierande typen styr om värdet kan muteras. För värdeklasser som inte exponerar några offentliga fält eller metoder som uppdaterar värdet på plats är pekaren skrivskyddad (därav namnet på prefixet). I synnerhet exponerar klasserna som representerar primitiva typer (till exempel System.Int32) inte mutatorer och är därför skrivskyddade.
En hanterad pekare som är begränsad på det här sättet kan endast användas på följande sätt:
objectSom parameter förldfldanvisningarna ,ldflda,stfld,callellerconstrained callvirt.Som parameter till
pointerinstruktionenldobjeller till någon avldindinstruktionerna.Som parameter till
sourceinstruktionencpobj.
Alla andra åtgärder tillåts inte, inklusive stobjåtgärderna , initobjeller eller mkrefany någon av stind instruktionerna.
Syftet med prefixet readonly är att undvika en typkontroll när du hämtar ett element från en matris i allmän kod. Uttrycket arr[i].m(), där elementtypen för matrisen arr är en allmän typ som har begränsats till att ha ett gränssnitt med metoden m, kan till exempel kompileras till följande MSIL.
ldloc arr
ldloc i
readonly.
ldelema !0 // Loads the pointer to the object.
… // Load the arguments to the call.
constrained. !0
callvirt m
Utan prefixet readonly skulle instruktionen ldelema utföra en typkontroll i det fall där !0 var en referenstyp. Den här typen av kontroll är inte bara ineffektiv, utan den är semantiskt felaktig. Typkontrollen för ldelema är en exakt matchning, som är för stark. Om matrisen innehåller underklasser av typen !0 skulle koden ovan misslyckas med typkontrollen.
Adressen till matriselementet hämtas, i stället för själva elementet, för att ha ett handtag för arr[i] som fungerar för både värdetyper och referenstyper, och kan därför skickas till instruktionen constrained callvirt .
I allmänhet skulle det vara osäkert att hoppa över körningskontrollen om matrisen innehåller element av en referenstyp. För att vara säker är det nödvändigt att se till att inga ändringar av matrisen görs via den här pekaren. Kontrollantreglerna säkerställer detta. Den begränsade hanterade pekaren kan skickas när objektet för instansmetoden anropar, så det är inte strikt skrivskyddat för värdetyper, men det finns inga typsäkerhetsproblem för värdetyper.
Följande Emit metodöverlagring kan använda readonly opcode: