OpCodes.Readonly Pole

Definicja

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 readonly System.Reflection.Emit.OpCode Readonly;

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:

  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 w takim przypadku nie ma operacji.

  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że być używany tylko w następujący sposób:

  • Jako parametr instrukcji objectldfld, ldflda, stfld, calllubconstrained callvirt .

  • pointer Jako parametr instrukcji ldobj lub do jednej z ldind instrukcji.

  • source Jako parametr instrukcjicpobj.

Wszystkie inne operacje niedozwolone, w tym stobjoperacje , initobjlub 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 readonlyldelema 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:

Dotyczy

Produkt Wersje
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0