OpCodes.Readonly Campo

Definición

Especifica que la operación de dirección de matriz subsiguiente no realiza ninguna comprobación de tipo en tiempo de ejecución y devuelve un puntero administrado cuya mutabilidad está restringida.Specifies that the subsequent array address operation performs no type check at run time, and that it returns a managed pointer whose mutability is restricted.

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 

Valor de campo

OpCode

Comentarios

En la tabla siguiente se muestra el formato de ensamblado hexadecimal de la instrucción y del lenguaje intermedio de Microsoft (MSIL), junto con un breve resumen de referencia:The following table lists the instruction's hexadecimal and Microsoft intermediate language (MSIL) assembly format, along with a brief reference summary:

FormatoFormat Formato de ensambladoAssembly Format DescripciónDescription
FE 1EFE 1E readonly.readonly. Especifica que la operación de dirección de matriz subsiguiente no realiza ninguna comprobación de tipo en tiempo de ejecución y devuelve un puntero administrado con mutabilidad restringida.Specify that the subsequent array address operation performs no type check at run time, and that it returns a managed pointer with restricted mutability.

Este prefijo solo puede aparecer inmediatamente antes de la ldelema instrucción y llama al Address método especial en las matrices.This prefix can only appear immediately preceding the ldelema instruction and calls to the special Address method on arrays. Su efecto en la operación subsiguiente es doble:Its effect on the subsequent operation is twofold:

  1. En tiempo de ejecución, no se realiza ninguna operación de comprobación de tipo.At run time, no type check operation is performed. Tenga en cuenta que normalmente hay una comprobación de tipo implícito para las ldelema stelem instrucciones y cuando se usa en matrices de tipos de referencia.Note that there is normally an implicit type check for the ldelema and stelem instructions when used on reference type arrays. Nunca hay una comprobación de tipo en tiempo de ejecución para las clases de valor, por lo que readonly es una operación no operativa en ese caso.There is never a run-time type check for value classes, so readonly is a no-op in that case.

  2. El comprobador trata el resultado de la operación de dirección como un puntero administrado con mutabilidad restringida.The verifier treats the result of the address-of operation as a managed pointer with restricted mutability.

Se dice que el puntero tiene una mutabilidad restringida porque el tipo de definición controla si el valor se puede mutar.The pointer is said to have restricted mutability because the defining type controls whether the value can be mutated. En el caso de las clases de valor que no exponen ningún campo o método público que actualice el valor en su lugar, el puntero es de solo lectura (por lo tanto, el nombre del prefijo).For value classes that expose no public fields or methods that update the value in place, the pointer is read-only (hence the name of the prefix). En concreto, las clases que representan tipos primitivos (por ejemplo, System. Int32) no exponen mutadores y, por tanto, son de solo lectura.In particular, the classes representing primitive types (for example, System.Int32) do not expose mutators and thus are read-only.

Un puntero administrado restringido de este modo solo se puede usar de las siguientes maneras:A managed pointer restricted in this fashion can be used only in the following ways:

  • Como object parámetro para las ldfld instrucciones, ldflda , stfld , call o constrained callvirt .As the object parameter for the ldfld, ldflda, stfld, call, orconstrained callvirt instructions.

  • Como pointer parámetro para la ldobj instrucción o en una de las ldind instrucciones.As the pointer parameter to the ldobj instruction or to one of the ldind instructions.

  • Como source parámetro de la cpobj instrucción.As the source parameter to the cpobj instruction.

Todas las demás operaciones no permitidas, incluidas stobj las initobj operaciones, o mkrefany , o cualquiera de las stind instrucciones.All other operations disallowed, including the stobj, initobj, or mkrefany operations, or any of the stind instructions.

El propósito del readonly prefijo es evitar una comprobación de tipo al capturar un elemento de una matriz en código genérico.The purpose of the readonly prefix is to avoid a type check when fetching an element from an array in generic code. Por ejemplo, la expresión arr[i].m() , donde el tipo de elemento de la matriz arr es un tipo genérico que se ha restringido para que tenga una interfaz con m el método, podría compilarse en el siguiente MSIL.For example, the expression arr[i].m(), where the element type of the array arr is a generic type that has been constrained to have an interface with method m, might compile to the following MSIL.

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

Sin el readonly prefijo, la ldelema instrucción realizaría una comprobación de tipo en el caso de que! 0 fuera un tipo de referencia.Without the readonly prefix, the ldelema instruction would perform a type check in the case where !0 was a reference type. Esta comprobación de tipo no solo es ineficaz, pero es semánticamente incorrecta.Not only is this type check inefficient, but it is semantically incorrect. La comprobación de tipos de ldelema es una coincidencia exacta, que es demasiado segura.The type check for ldelema is an exact match, which is too strong. Si la matriz contiene subclases de tipo! 0, el código anterior produciría un error en la comprobación de tipos.If the array held subclasses of type !0, the code above would fail the type check.

Se captura la dirección del elemento de la matriz, en lugar del propio elemento, para tener un controlador para arr[i] que funcione con los tipos de valor y los tipos de referencia y, por tanto, se pueda pasar a la constrained callvirt instrucción.The address of the array element is fetched, instead of the element itself, in order to have a handle for arr[i] that works for both value types and reference types, and thus can be passed to the constrained callvirt instruction.

En general, no es seguro omitir la comprobación en tiempo de ejecución si la matriz contiene elementos de un tipo de referencia.In general it would be unsafe to skip the run-time check if the array held elements of a reference type. Para que sea seguro, es necesario asegurarse de que no se realicen modificaciones en la matriz a través de este puntero.To be safe, it is necessary to ensure that no modifications to the array are made through this pointer. Las reglas del comprobador lo garantizan.The verifier rules ensure this. El puntero administrado restringido se puede pasar como el objeto de las llamadas al método de instancia, por lo que no está estrictamente hablando de solo lectura para los tipos de valor, pero no hay ningún problema de seguridad de tipos para los tipos de valor.The restricted managed pointer can be passed as the object of instance method calls, so it is not strictly speaking read-only for value types, but there is no type safety problem for value types.

La siguiente Emit sobrecarga del método puede utilizar el readonly código de operación:The following Emit method overload can use the readonly opcode:

Se aplica a