OpCodes.Constrained 필드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
가상 메서드 호출이 이루어지는 형식을 제한합니다.
public: static initonly System::Reflection::Emit::OpCode Constrained;
public static readonly System.Reflection.Emit.OpCode Constrained;
staticval mutable Constrained : System.Reflection.Emit.OpCode
Public Shared ReadOnly Constrained As OpCode
필드 값
설명
다음 표에서는 간단한 참조 요약과 함께 명령의 16진수 및 MSIL(Microsoft Intermediate Language) 어셈블리 형식을 나열합니다.
판 | 어셈블리 형식 | 묘사 |
---|---|---|
FE 16 <T > |
제한. thisType |
형식이 T 제한되는 형식에서 가상 메서드를 호출합니다. |
constrained
접두사는 callvirt
명령에만 허용됩니다.
이 시점에서 MSIL 스택의 상태는 다음과 여야 합니다.
관리되는 포인터인
ptr
스택에 푸시됩니다.ptr
형식은thisType
관리되는 포인터(&
)여야 합니다. 이는thisType
참조가 예상되는 접두사 없는callvirt
명령의 경우와 다릅니다.argN
통해arg1
메서드 인수는 접두사 없는callvirt
명령과 마찬가지로 스택에 푸시됩니다.
constrained
접두사는 thisType
값 형식인지 참조 형식인지와 관계없이 균일한 방식으로 callvirt
명령을 만들 수 있도록 설계되었습니다.
constrained
thisType
callvirt
method
명령 앞에 접두사를 지정하면 다음과 같이 명령이 실행됩니다.
thisType
값 형식이 아닌 참조 형식인 경우ptr
역참조되고method
callvirt
대한 'this' 포인터로 전달됩니다.thisType
값 형식이고thisType
method
구현하는 경우ptr
thisType
method
구현하기 위해call
method
명령에 대한 'this' 포인터로 수정되지 않은 상태로 전달됩니다.thisType
값 형식이고thisType
method
구현하지 않는 경우ptr
역참조, 상자화 및callvirt
method
명령에 대한 'this' 포인터로 전달됩니다.
이 마지막 사례는 method
Object, ValueType또는 Enum 정의되고 thisType
재정의되지 않은 경우에만 발생할 수 있습니다. 이 경우 boxing을 사용하면 원래 개체의 복사본이 만들어집니다. 그러나 Object, ValueType및 Enum 개체의 상태를 수정하는 메서드가 없으므로 이 사실을 검색할 수 없습니다.
constrained
접두사는 제네릭 코드를 만드는 IL 생성기를 지원합니다. 일반적으로 callvirt
명령은 값 형식에서 유효하지 않습니다. 대신 IL 컴파일러는 ptr
형식 및 호출되는 메서드에 따라 컴파일 시간에 위에 설명된 'this' 변환을 효과적으로 수행해야 합니다. 그러나 ptr
컴파일 시간에 알 수 없는 제네릭 형식인 경우 컴파일 시간에 이 변환을 수행할 수 없습니다.
constrained
opcode를 사용하면 IL 컴파일러가 ptr
값 형식인지 참조 형식인지와 관계없이 균일한 방식으로 가상 함수를 호출할 수 있습니다.
thisType
제네릭 형식 변수인 경우를 위한 것이지만, constrained
접두사는 비제너릭 형식에도 작동하며 값 형식과 참조 형식 간의 구별을 숨기는 언어로 가상 호출을 생성하는 복잡성을 줄일 수 있습니다.
constrained
접두사를 사용하면 값 형식의 잠재적인 버전 관리 문제도 방지할 수 있습니다.
constrained
접두사를 사용하지 않는 경우 값 형식이 System.Object 메서드를 재정의하는지 여부에 따라 다른 IL을 내보내야 합니다. 예를 들어 값 형식 V
Object.ToString() 메서드를 재정의하는 경우 call
V.ToString()
명령이 내보내집니다. 그렇지 않으면 box
명령과 callvirt
Object.ToString()
명령이 내보내집니다. 재정의가 나중에 제거된 경우 이전의 경우와 재정의가 나중에 추가될 경우 버전 관리 문제가 발생할 수 있습니다.
인터페이스 메서드를 구현하는 값 형식 메서드를 MethodImpl
사용하여 변경할 수 있으므로 값 형식에서 인터페이스 메서드를 호출하는 데도 constrained
접두사를 사용할 수 있습니다.
constrained
접두사를 사용하지 않으면 컴파일러는 컴파일 시간에 바인딩할 값 형식의 메서드 중 하나를 선택해야 합니다.
constrained
접두사를 사용하면 MSIL이 컴파일 시간이 아닌 런타임에 인터페이스 메서드를 구현하는 메서드에 바인딩할 수 있습니다.
다음 Emit 메서드 오버로드는 constrained
opcode를 사용할 수 있습니다.
적용 대상
.NET