OpCodes.Readonly Pole
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Określa, że kolejna operacja adres tablicy nie wykonuje sprawdzania typu w czasie wykonywania i 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 format zestawu szesnastkowy i microsoft intermediate language (MSIL) instrukcji wraz z krótkim podsumowaniem referencyjnym:
Format | Format zestawu | Opis |
---|---|---|
FE 1E | Readonly. | Określ, że kolejna operacja adresu tablicy nie wykonuje sprawdzania typu w czasie wykonywania i że zwraca zarządzany wskaźnik z ograniczoną niezmiennością. |
Ten prefiks może pojawiać się bezpośrednio przed instrukcją ldelema
i wywołuje metodę specjalną Address
w tablicach. Jej wpływ na kolejną operację jest dwa razy:
W czasie wykonywania nie jest wykonywana żadna operacja sprawdzania typu. Należy pamiętać, że zwykle istnieje niejawne sprawdzanie
ldelema
typu dla instrukcji istelem
w przypadku użycia w tablicach typów odwołań. Nigdy nie ma sprawdzania typu czasu wykonywania dla klas wartości, więcreadonly
w takim przypadku nie ma operacji.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że być używany tylko w następujący sposób:
Jako parametr instrukcji
object
ldfld
,ldflda
,stfld
,call
lubconstrained callvirt
.pointer
Jako parametr instrukcjildobj
lub do jednej zldind
instrukcji.source
Jako parametr instrukcjicpobj
.
Wszystkie inne operacje niedozwolone, w tym stobj
operacje , initobj
lub mkrefany
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 readonly
ldelema
instrukcja wykonuje sprawdzanie typu w przypadku, gdy !0 był typem referencyjnym. Nie tylko ten typ jest nieefektywny, ale jest semantycznie niepoprawny. Sprawdzanie ldelema
typu jest dokładnym dopasowaniem, które jest zbyt silne. Jeśli tablica zawiera podklasy typu !0, powyższy kod zakończy się niepowodzeniem podczas 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 referencyjnych, a tym samym można przekazać do constrained callvirt
instrukcji.
Ogólnie rzecz biorąc, niebezpieczne byłoby pominięcie sprawdzania czasu wykonywania, czy tablica zawiera elementy typu odwołania. Aby zapewnić bezpieczeństwo, należy upewnić się, że nie wprowadzono żadnych modyfikacji tablicy za pośrednictwem tego wskaźnika. Reguły weryfikatora zapewniają to. Ograniczony wskaźnik zarządzany można przekazać jako obiekt wywołań metody wystąpienia, więc nie jest ściśle rzecz biorąc tylko do odczytu dla typów wartości, ale nie ma problemu z bezpieczeństwem typów wartości.
Emit Następujące przeciążenie metody może używać readonly
kodu opcode: