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
메서드에 대한 명령 및 호출 바로 앞에 나타날 수 있습니다. 후속 작업에 미치는 영향은 두 가지입니다.
런타임에는 형식 검사 작업이 수행되지 않습니다. 일반적으로 참조 형식 배열에서 사용되는 경우 및
stelem
지침에 대한ldelema
암시적 형식 검사 있습니다. 값 클래스에 대해 검사 런타임 형식은 없으므로readonly
이 경우 no-op입니다.검증 도구는 주소 작업의 결과를 제한된 변경 가능성을 가진 관리형 포인터로 처리합니다.
정의 형식이 값을 변경할 수 있는지 여부를 제어하기 때문에 포인터가 변경 가능성을 제한한다고 합니다. 현재 위치에서 값을 업데이트하는 공용 필드 또는 메서드를 노출하지 않는 값 클래스의 경우 포인터는 읽기 전용(따라서 접두사 이름)입니다. 특히 기본 형식(예: System.Int32)을 나타내는 클래스는 변경자를 노출하지 않으므로 읽기 전용입니다.
이러한 방식으로 제한된 관리형 포인터는 다음과 같은 방법으로만 사용할 수 있습니다.
object
, ,ldflda
,stfld
call
또는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
사용할 수 있습니다.
적용 대상
.NET