OpCodes.Constrained 필드

정의

가상 메서드 호출이 이루어지는 형식을 제한합니다.

public static readonly System.Reflection.Emit.OpCode Constrained;

필드 값

설명

다음 표에서는 간단한 참조 요약과 함께 명령의 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를 사용할 수 있습니다.

적용 대상

제품 버전
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0