OpCodes.Readonly 필드

정의

후속 배열 주소 연산에서 런타임에 형식 검사를 수행하지 않고 가변성이 제한된 관리되는 포인터를 반환하도록 지정합니다.

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 

필드 값

OpCode

설명

다음 표에는 간단한 참조 요약과 함께 명령의 16진수 및 MSIL(Microsoft Intermediate Language) 어셈블리 형식이 나와 있습니다.

서식 어셈블리 형식 Description
FE 1E 읽기 전용. 후속 배열 주소 작업이 런타임에 형식 검사를 수행하지 않고 변경 가능성이 제한된 관리형 포인터를 반환되도록 지정합니다.

이 접두사는 배열의 ldelema 특수 Address 메서드에 대한 명령 및 호출 바로 앞에만 나타날 수 있습니다. 후속 작업에 미치는 영향은 두 가지입니다.

  1. 런타임에는 형식 검사 작업이 수행되지 않습니다. 참조 형식 배열에서 사용되는 경우 일반적으로 암시적 형식 검사 ldelemastelem 명령이 있습니다. 값 클래스에 대한 런타임 형식 검사는 없으므로 readonly 이 경우 no-op입니다.

  2. 검증 도구는 주소 작업의 결과를 변경 가능성이 제한된 관리형 포인터로 처리합니다.

포인터는 정의 형식이 값을 변경할 수 있는지 여부를 제어하기 때문에 변경 가능성을 제한한다고 합니다. 현재 위치에서 값을 업데이트하는 공용 필드 또는 메서드를 노출하지 않는 값 클래스의 경우 포인터는 읽기 전용입니다(따라서 접두사 이름). 특히 기본 형식(예: System.Int32)을 나타내는 클래스는 변경자를 노출하지 않으므로 읽기 전용입니다.

이러한 방식으로 제한된 관리되는 포인터는 다음과 같은 방법으로만 사용할 수 있습니다.

  • object, , call``ldflda``stfld또는constrained callvirt 명령의 ldfld매개 변수입니다.

  • pointer 명령 또는 명령 중 ldind 하나에 대한 매개 변수 ldobj 입니다.

  • 명령의 source 매개 변수입니다 cpobj .

다른 모든 작업(예: stobj``initobj또는 작업 또는 mkrefany 지침 포함)이 허용되지 않습니다stind.

접두사 readonly 목적은 제네릭 코드의 배열에서 요소를 가져올 때 형식 검사를 방지하는 것입니다. 예를 들어 배열 arr 의 요소 형식이 메서드m와 인터페이스를 갖도록 제한된 제네릭 형식인 식arr[i].m()은 다음 MSIL로 컴파일될 수 있습니다.

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

접두사 readonly ldelema 없이 !0이 참조 형식인 경우 명령에서 형식 검사를 수행합니다. 이 형식은 비효율적일 뿐만 아니라 의미상 올바르지 않습니다. 형식 검사가 ldelema 너무 강한 정확한 일치 항목입니다. 배열이 !0 형식의 서브클래스를 보유하는 경우 위의 코드는 형식 검사에 실패합니다.

배열 요소의 주소는 값 형식과 참조 형식 모두에 대해 arr[i] 작동하는 핸들을 갖기 위해 요소 자체 대신 페치되므로 명령에 전달할 constrained callvirt 수 있습니다.

일반적으로 배열에 참조 형식의 요소가 있는지 런타임 검사를 건너뛰는 것은 안전하지 않습니다. 안전하려면 이 포인터를 통해 배열을 수정하지 않도록 해야 합니다. 검증 도구 규칙은 이를 보장합니다. 제한된 관리형 포인터는 인스턴스 메서드 호출의 개체로 전달될 수 있으므로 값 형식에 대해 읽기 전용으로 엄격하게 말하는 것은 아니지만 값 형식에 대한 형식 안전 문제는 없습니다.

다음 Emit 메서드 오버로드는 opcode를 readonly 사용할 수 있습니다.

적용 대상