OpCodes.Readonly Pole

Definicja

Określa, że kolejna operacja adresu tablicy nie wykonuje sprawdzania typu w czasie wykonywania i że zwraca zarządzany wskaźnik, którego niezmienność jest ograniczona.

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 

Wartość pola

Uwagi

W poniższej tabeli wymieniono szesnastkowe i Microsoft format zestawu języka pośredniego (MSIL) instrukcji wraz z krótkim podsumowaniem referencyjnym:

Format Format zestawu Opis
FE 1E tylko do czytania. Określ, że kolejna operacja adresów tablicy nie sprawdza typu w czasie wykonywania i że zwraca zarządzany wskaźnik z ograniczoną niezmiennością.

Ten prefiks może pojawić się bezpośrednio przed instrukcją ldelema i wywołania metody specjalnej Address w tablicach. Jego wpływ na kolejną operację jest dwa razy:

  1. W czasie wykonywania nie jest wykonywana żadna operacja sprawdzania typu. Należy pamiętać, że zwykle istnieje niejawne sprawdzanie ldelema typu dla instrukcji i stelem w przypadku użycia w tablicach typów odwołań. Nigdy nie ma sprawdzania typu czasu wykonywania dla klas wartości, więc readonly jest to no-op w tym przypadku.

  2. Weryfikator traktuje wynik operacji adres-of jako zarządzany wskaźnik z ograniczoną niezmiennością.

Mówi się, że wskaźnik ma ograniczoną niezmienność, ponieważ definiujący typ kontroluje, czy wartość może być zmutowana. W przypadku klas wartości, które nie udostępniają żadnych publicznych pól lub metod aktualizujących wartość, wskaźnik jest tylko do odczytu (stąd nazwa prefiksu). W szczególności klasy reprezentujące typy pierwotne (na przykład System.Int32) nie uwidaczniają mutatorów, a tym samym są tylko do odczytu.

Zarządzany wskaźnik ograniczony w ten sposób można używać tylko w następujący sposób:

  • object Jako parametr instrukcji ldfld, ldflda, stfld, calllubconstrained callvirt .

  • Jako parametr instrukcji pointerldobj lub do jednej z ldind instrukcji.

  • source Jako parametr instrukcjicpobj.

Wszystkie inne operacje niedozwolone, w tym stobjoperacje , initobjlub mkrefany lub dowolne z stind instrukcji.

Celem prefiksu readonly jest uniknięcie sprawdzania typu podczas pobierania elementu z tablicy w kodzie ogólnym. Na przykład wyrażenie arr[i].m(), gdzie typ elementu tablicy arr jest typem ogólnym, który został ograniczony do interfejsu z metodą m, może zostać skompilowany do następującego MSIL.

ldloc arr
ldloc i
readonly.
ldelema !0    // Loads the pointer to the object.
…             // Load the arguments to the call.
constrained. !0
callvirt m

Bez prefiksu readonlyldelema instrukcja wykona sprawdzanie typu w przypadku, gdy !0 był typem odwołania. Nie tylko ten typ jest nieefektywny ewidencjonować, ale jest semantycznie niepoprawny. Sprawdzanie ldelema typu jest dokładnym dopasowaniem, co jest zbyt silne. Jeśli tablica zawiera podklasy typu !0, powyższy kod zakończy się niepowodzeniem sprawdzania typu.

Adres elementu tablicy jest pobierany, zamiast samego elementu, w celu zapewnienia uchwytu, arr[i] który działa zarówno dla typów wartości, jak i typów odwołań, a tym samym można przekazać do constrained callvirt instrukcji.

Ogólnie rzecz biorąc, byłoby niebezpieczne pominięcie sprawdzania czasu wykonywania, czy tablica przechowywała elementy typu odwołania. Aby zapewnić bezpieczeństwo, należy upewnić się, że nie wprowadzono żadnych modyfikacji tablicy za pomocą tego wskaźnika. Reguły weryfikatora zapewniają to. Ograniczony wskaźnik zarządzany może być przekazywany jako obiekt wywołań metody wystąpienia, więc nie jest ściśle mówiąc tylko do odczytu dla typów wartości, ale nie ma problemu z bezpieczeństwem typu dla typów wartości.

Następujące Emit przeciążenie metody może używać readonly kodu opcode:

Dotyczy