OpCodes.Constrained Pole
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Ogranicza typ, na którym jest wykonywane wywołanie metody wirtualnej.
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
Wartość pola
Uwagi
W poniższej tabeli wymieniono format zestawu szesnastkowy i szesnastkowy język microsoft (MSIL) wraz z krótkim podsumowaniem referencyjnym:
Format | Format zestawu | Opis |
---|---|---|
FE 16 <T > |
Ograniczone. thisType |
Wywołaj metodę wirtualną dla typu ograniczonego do typu T . |
Prefiks constrained
jest dozwolony tylko w callvirt
instrukcji.
Stan stosu MSIL w tym momencie musi być następujący:
Zarządzany wskaźnik ,
ptr
jest wypychany do stosu. Typ musiptr
być wskaźnikiem zarządzanym (&
) dothisType
. Należy pamiętać, że różni się to od przypadku nieprefiksowanejcallvirt
instrukcji, która oczekuje odwołania dothisType
elementu .Argumenty
arg1
argN
metody są wypychane do stosu, podobnie jak w przypadku nieprefiksowanejcallvirt
instrukcji.
Prefiks constrained
jest zaprojektowany tak, aby umożliwić callvirt
wykonywanie instrukcji w jednolity sposób niezależnie od tego, czy thisType
jest typem wartości, czy typem odwołania.
callvirt
method
Gdy instrukcja została poprzedzona prefiksem constrained
thisType
, instrukcja jest wykonywana w następujący sposób:
Jeśli
thisType
jest typem odwołania (w przeciwieństwie do typu wartości),ptr
jest wyłuszczone i przekazywane jako wskaźnik "this" docallvirt
wartościmethod
.Jeśli
thisType
jest typem wartości ithisType
implementujemethod
,ptr
jest przekazywany niezmodyfikowany jako wskaźnik "this" docall
method
instrukcji, w celu implementacjimethod
przezthisType
.Jeśli
thisType
jest typem wartości ithisType
nie implementujemethod
,ptr
zostanie wyłuszczone, w polu i przekazane jako wskaźnik "this" docallvirt
method
instrukcji.
Ten ostatni przypadek może wystąpić tylko wtedy, gdy method
został zdefiniowany w Objectobiekcie , ValueTypelub, a Enum nie przesłonięć przez thisType
. W tym przypadku boks powoduje utworzenie kopii oryginalnego obiektu. Jednak ze względu na to, że żadna z metod Object, ValueTypei Enum nie modyfikuje stanu obiektu, nie można wykryć tego faktu.
Prefiks constrained
obsługuje generatory IL, które tworzą kod ogólny. Zwykle instrukcja jest nieprawidłowa callvirt
dla typów wartości. Zamiast tego wymagane jest, aby kompilatory IL skutecznie wykonywać transformację "this" opisane powyżej w czasie kompilacji, w zależności od typu i wywoływanej ptr
metody. Jednak jeśli ptr
jest typem ogólnym, który jest nieznany w czasie kompilacji, nie można dokonać tej transformacji w czasie kompilacji.
Kod constrained
opcode umożliwia kompilatorom IL wywołanie funkcji wirtualnej w jednolity sposób niezależnie od tego, czy ptr
jest typem wartości, czy typem odwołania. Chociaż jest przeznaczona dla przypadku, gdy thisType
jest zmienną typu ogólnego, constrained
prefiks działa również dla typów niegeneracyjnych i może zmniejszyć złożoność generowania wywołań wirtualnych w językach, które ukrywają rozróżnienie między typami wartości i typami referencyjnymi.
Użycie prefiksu constrained
pozwala również uniknąć potencjalnych problemów z przechowywaniem wersji z typami wartości. constrained
Jeśli prefiks nie jest używany, w zależności od tego, czy typ wartości zastępuje metodę System.Object. Jeśli na przykład typ V
wartości zastępuje metodę Object.ToString(), instrukcja jest emitowana; jeśli tak nie jest, call
box
V.ToString()
instrukcja i callvirt
Object.ToString()
instrukcja są emitowane. Problem z przechowywaniem wersji może wystąpić w pierwszym przypadku, jeśli przesłonięcia zostanie później usunięte, a w drugim przypadku, jeśli zastąpienie zostanie później dodane.
Prefiks constrained
może być również używany do wywoływania metod interfejsu w typach wartości, ponieważ metoda typu wartości implementowania metody interfejsu może zostać zmieniona przy użyciu metody MethodImpl
. constrained
Jeśli prefiks nie jest używany, kompilator jest zmuszony do wybrania metod typu wartości do powiązania z w czasie kompilacji. Użycie prefiksu constrained
umożliwia MSIL powiązanie z metodą, która implementuje metodę interfejsu w czasie wykonywania, a nie w czasie kompilacji.
Następujące Emit przeciążenie metody może używać constrained
kodu opcode:
Dotyczy
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla