다음을 통해 공유


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 

필드 값

설명

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

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

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

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

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

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

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

  • object, , ldflda, stfldcall또는constrained callvirt 지침에 ldfld대한 매개 변수입니다.

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

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

, initobj또는 작업 또는 mkrefany 지침을 포함하여 stobj허용되지 않는 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 수 있습니다.

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

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

적용 대상