OpCodes.Readonly 필드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
후속 배열 주소 연산에서 런타임에 형식 검사를 수행하지 않고 가변성이 제한된 관리되는 포인터를 반환하도록 지정합니다.
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 메서드에 대한 명령 및 호출 바로 앞에만 나타날 수 있습니다. 후속 작업에 미치는 영향은 두 가지입니다.
런타임에는 형식 검사 작업이 수행되지 않습니다. 참조 형식 배열에서 사용되는 경우 일반적으로 암시적 형식 검사
ldelema및stelem명령이 있습니다. 값 클래스에 대한 런타임 형식 검사는 없으므로readonly이 경우 no-op입니다.검증 도구는 주소 작업의 결과를 변경 가능성이 제한된 관리형 포인터로 처리합니다.
포인터는 정의 형식이 값을 변경할 수 있는지 여부를 제어하기 때문에 변경 가능성을 제한한다고 합니다. 현재 위치에서 값을 업데이트하는 공용 필드 또는 메서드를 노출하지 않는 값 클래스의 경우 포인터는 읽기 전용입니다(따라서 접두사 이름). 특히 기본 형식(예: 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 사용할 수 있습니다.