다음을 통해 공유


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) 어셈블리 형식을 나열합니다.

어셈블리 형식 묘사
FE 16 <T> 제한. thisType 형식이 T제한되는 형식에서 가상 메서드를 호출합니다.

constrained 접두사는 callvirt 명령에만 허용됩니다.

이 시점에서 MSIL 스택의 상태는 다음과 여야 합니다.

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

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

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

constrained thisType callvirt method 명령 앞에 접두사를 지정하면 다음과 같이 명령이 실행됩니다.

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

  • thisType 값 형식이고 thisTypemethod 구현하는 경우 ptrthisTypemethod 구현하기 위해 callmethod 명령에 대한 'this' 포인터로 수정되지 않은 상태로 전달됩니다.

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

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

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

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

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

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

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

적용 대상