¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Exportar (0) Imprimir
Expandir todo
Expandir Minimizar

OpCodes.Readonly (Campo)

Nota: este campo es nuevo en la versión 2.0 de .NET Framework.

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.

Espacio de nombres: System.Reflection.Emit
Ensamblado: mscorlib (en mscorlib.dll)

public static readonly OpCode Readonly
public static final OpCode Readonly
public static final var Readonly : OpCode

En la tabla siguiente, se muestra el ensamblado de la instrucción en formato hexadecimal y en formato de Lenguaje intermedio de Microsoft (MSIL), junto con un breve resumen de referencia:

Formato

Formato del ensamblado

Descripción

FE 1E

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 cuya mutabilidad está restringida.

Este prefijo sólo puede aparecer inmediatamente antes de la instrucción ldelema y llamada al método especial Address en matrices. Su efecto en la operación subsiguiente es doble:

  1. En tiempo de ejecución, no se realiza ninguna operación de comprobación de tipo. Observe que hay normalmente una comprobación de tipo implícita para ldelema e instrucciones stelem cuando se utiliza en matrices de tipo de referencia. Nunca se produce una comprobación de tipo en tiempo de ejecución para las clases de valor, por lo que readonly es una operación inefectiva en ese caso.

  2. El verificador trata el resultado de la operación de dirección como un puntero administrado con mutabilidad restringida.

Se dice que el puntero ha restringido la mutabilidad porque el tipo definidor controla si se puede cambiar el valor. Para clases de valor que no exponen ningún campo público o métodos que actualizan el valor en la ubicación correspondiente, el puntero es de sólo lectura (de ahí el nombre del prefijo). En particular, las clases que representan los tipos primitivos (por ejemplo, System.Int32) no exponen ninguna función de mutación y, por tanto, son de sólo lectura.

Un puntero administrado restringido de este modo sólo se puede utilizar de las maneras siguientes:

  • Como parámetro object de las instrucciones máquina ldfld, ldflda, stfld, call o constrained callvirt.

  • Como parámetro pointer de la instrucción máquina ldobj o de una de las instrucciones máquina ldind.

  • Como parámetro source de la instrucción máquina cpobj.

Todas las demás operaciones se deniegan, incluso las operaciones stobj, initobj o mkrefany, o cualquiera de las instrucciones máquina stind.

El propósito del prefijo readonly es evitar una comprobación de tipo al obtener un elemento de una matriz en código genérico. 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 tener una interfaz con el método m, podría compilar al MSIL siguiente.

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 prefijo readonly, la instrucción máquina ldelema realizaría una comprobación de tipo en el caso de que !0 fuera un tipo de referencia. Esta comprobación no sólo es de tipo ineficaz, además es semánticamente incorrecta. La comprobación de tipo para ldelema es una coincidencia exacta que es demasiado segura. Si la matriz contuviera subclases de tipo !0, la comprobación de tipo produciría un error en el código anterior.

Se obtiene la dirección del elemento de matriz, en lugar del propio elemento, para tener un identificador de arr[i] que funciona para tipos de valor y tipos de referencia, de modo que se pueda pasar a la instrucción máquina constrained callvirt.

En general no sería seguro omitir la comprobación en tiempo de ejecución si la matriz contuviera elementos de un tipo de referencia. Para que sea seguro, es necesario garantizar que no se realizará ninguna modificación a la matriz a través de este puntero. Las reglas del verificador garantizan esto. El puntero administrado restringido se puede pasar como el objeto de llamadas al método de la instancia, por lo que no es propiamente de sólo lectura para los tipos de valor, pero no hay ningún problema de seguridad para dichos tipos.

La siguiente sobrecarga del método Emit puede utilizar el código de operación readonly:

  • ILGenerator.Emit(OpCode)

Windows 98, Windows 2000 SP4, Windows Millennium, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft