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) 어셈블리 형식이 나와 있습니다.
서식 | 어셈블리 형식 | Description |
---|---|---|
FE 16 <T > |
제한. thisType |
형식으로 제한되는 형식에서 가상 메서드를 T 호출합니다. |
접두사는 constrained
명령에만 callvirt
허용됩니다.
이 시점에서 MSIL 스택의 상태는 다음과 여야 합니다.
관리되는 포인터 가
ptr
스택에 푸시됩니다. 의 형식은 에ptr
대한 관리형 포인터(&
)thisType
여야 합니다. 이는 의 참조thisType
가 필요한 접두callvirt
사 없는 명령의 경우와 다릅니다.메서드 인수
arg1
argN
는 접두사 없는 명령과 마찬가지로 스택에 푸시됩니다callvirt
.
constrained
접두사는 가 값 형식인지 참조 형식인지와 thisType
관계없이 균일한 방식으로 명령을 만들 수 있도록 callvirt
설계되었습니다.
명령이 callvirt
method
접두사로 constrained
thisType
추가되면 명령은 다음과 같이 실행됩니다.
가 값
ptr
형식이 아닌 참조 형식인 경우thisType
는 역참조되고 의method
에 대한 'this' 포인터callvirt
로 전달됩니다.가 값 형식이고
thisType
를 구현method
ptr
하는 경우thisType
가 의 구현method
thisType
을 위해call
method
명령의 'this' 포인터로 수정되지 않은 상태로 전달됩니다.가 값 형식이고
thisType
를 구현method
ptr
하지 않는 경우thisType
는 역참조되고, 상자화되고, 명령에 대한 'this' 포인터callvirt
method
로 전달됩니다.
이 마지막 사례는 가 , ValueType또는 Enum 에 정의되어 있고 에 Object의해 thisType
재정의되지 않은 경우에만 method
발생할 수 있습니다. 이 경우 boxing을 사용하면 원래 개체의 복사본이 만들어집니다. 그러나 , ValueType및 Enum 의 Object메서드 중 어느 것도 개체의 상태를 수정하지 않으므로 이 사실을 검색할 수 없습니다.
접두사는 constrained
제네릭 코드를 만드는 IL 생성기를 지원합니다. 일반적으로 명령이 callvirt
값 형식에서 유효하지 않습니다. 대신 IL 컴파일러가 의 형식 ptr
과 호출되는 메서드에 따라 컴파일 시간에 위에 설명된 'this' 변환을 효과적으로 수행해야 합니다. 그러나 ptr
가 컴파일 시간에 알 수 없는 제네릭 형식인 경우 컴파일 시간에 이 변환을 수행할 수 없습니다.
constrained
opcode를 사용하면 IL 컴파일러가 값 형식인지 참조 형식인지와 ptr
관계없이 균일한 방식으로 가상 함수를 호출할 수 있습니다. 가 제네릭 형식 변수 constrained
인 경우 thisType
를 위한 것이지만 접두사는 제네릭이 아닌 형식에도 작동하며 값 형식과 참조 형식 간의 구별을 숨기는 언어로 가상 호출을 생성하는 복잡성을 줄일 수 있습니다.
접두사를 constrained
사용하면 값 형식에 대한 잠재적인 버전 관리 문제도 방지할 수 있습니다. 접두사를 constrained
사용하지 않는 경우 값 형식이 System.Object 메서드를 재정의하는지 여부에 따라 다른 IL을 내보내야 합니다. 예를 들어 값 형식 V
이 Object.ToString() 메서드 call
V.ToString()
를 재정의하면 명령이 내보내집니다. 그렇지 않으면 box
명령과 명령이 callvirt
Object.ToString()
내보내집니다. 재정의가 나중에 제거된 경우 이전의 경우 버전 관리 문제가 발생할 수 있으며, 후자의 경우 재정의가 나중에 추가될 경우 발생할 수 있습니다.
접두사는 constrained
를 사용하여 MethodImpl
인터페이스 메서드를 구현하는 값 형식 메서드를 변경할 수 있으므로 값 형식에서 인터페이스 메서드를 호출하는 데 사용할 수도 있습니다. 접두사를 constrained
사용하지 않으면 컴파일러는 컴파일 시간에 바인딩할 값 형식의 메서드 중 하나를 선택해야 합니다. 접두사를 constrained
사용하면 MSIL이 컴파일 시간이 아닌 런타임에 인터페이스 메서드를 구현하는 메서드에 바인딩할 수 있습니다.
다음 Emit 메서드 오버로드는 opcode를 constrained
사용할 수 있습니다.
적용 대상
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기