OpCodes.Constrained 필드

정의

가상 메서드가 호출되는 형식을 제한합니다.

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 스택의 상태는 다음과 여야 합니다.

  1. 관리되는 포인터 가 ptr스택에 푸시됩니다. 의 형식은 에 ptr 대한 관리형 포인터(&) thisType여야 합니다. 이는 의 참조thisType가 필요한 접두 callvirt 사 없는 명령의 경우와 다릅니다.

  2. 메서드 인수 arg1argN 는 접두사 없는 명령과 마찬가지로 스택에 푸시됩니다 callvirt .

constrained 접두사는 가 값 형식인지 참조 형식인지와 thisType 관계없이 균일한 방식으로 명령을 만들 수 있도록 callvirt 설계되었습니다.

명령이 callvirtmethod 접두사로 constrainedthisType추가되면 명령은 다음과 같이 실행됩니다.

  • 가 값 ptr 형식이 아닌 참조 형식인 경우 thisType 는 역참조되고 의 method에 대한 'this' 포인터 callvirt 로 전달됩니다.

  • 가 값 형식이고 thisType 를 구현 methodptr 하는 경우 thisType 가 의 구현 methodthisType을 위해 callmethod 명령의 'this' 포인터로 수정되지 않은 상태로 전달됩니다.

  • 가 값 형식이고 thisType 를 구현 methodptr 하지 않는 경우 thisType 는 역참조되고, 상자화되고, 명령에 대한 'this' 포인터 callvirtmethod 로 전달됩니다.

이 마지막 사례는 가 , ValueType또는 Enum 에 정의되어 있고 에 Object의해 thisType재정의되지 않은 경우에만 method 발생할 수 있습니다. 이 경우 boxing을 사용하면 원래 개체의 복사본이 만들어집니다. 그러나 , ValueTypeEnumObject메서드 중 어느 것도 개체의 상태를 수정하지 않으므로 이 사실을 검색할 수 없습니다.

접두사는 constrained 제네릭 코드를 만드는 IL 생성기를 지원합니다. 일반적으로 명령이 callvirt 값 형식에서 유효하지 않습니다. 대신 IL 컴파일러가 의 형식 ptr 과 호출되는 메서드에 따라 컴파일 시간에 위에 설명된 'this' 변환을 효과적으로 수행해야 합니다. 그러나 ptr 가 컴파일 시간에 알 수 없는 제네릭 형식인 경우 컴파일 시간에 이 변환을 수행할 수 없습니다.

constrained opcode를 사용하면 IL 컴파일러가 값 형식인지 참조 형식인지와 ptr 관계없이 균일한 방식으로 가상 함수를 호출할 수 있습니다. 가 제네릭 형식 변수 constrained 인 경우 thisType 를 위한 것이지만 접두사는 제네릭이 아닌 형식에도 작동하며 값 형식과 참조 형식 간의 구별을 숨기는 언어로 가상 호출을 생성하는 복잡성을 줄일 수 있습니다.

접두사를 constrained 사용하면 값 형식에 대한 잠재적인 버전 관리 문제도 방지할 수 있습니다. 접두사를 constrained 사용하지 않는 경우 값 형식이 System.Object 메서드를 재정의하는지 여부에 따라 다른 IL을 내보내야 합니다. 예를 들어 값 형식 V 이 Object.ToString() 메서드 callV.ToString() 를 재정의하면 명령이 내보내집니다. 그렇지 않으면 box 명령과 명령이 callvirtObject.ToString() 내보내집니다. 재정의가 나중에 제거된 경우 이전의 경우 버전 관리 문제가 발생할 수 있으며, 후자의 경우 재정의가 나중에 추가될 경우 발생할 수 있습니다.

접두사는 constrained 를 사용하여 MethodImpl인터페이스 메서드를 구현하는 값 형식 메서드를 변경할 수 있으므로 값 형식에서 인터페이스 메서드를 호출하는 데 사용할 수도 있습니다. 접두사를 constrained 사용하지 않으면 컴파일러는 컴파일 시간에 바인딩할 값 형식의 메서드 중 하나를 선택해야 합니다. 접두사를 constrained 사용하면 MSIL이 컴파일 시간이 아닌 런타임에 인터페이스 메서드를 구현하는 메서드에 바인딩할 수 있습니다.

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

적용 대상