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 microsoft intermediate language (MSIL) instrukcji 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 instrukcji callvirt.
Stan stosu MSIL w tym momencie musi być następujący:
Zarządzany wskaźnik,
ptr, jest wypychany do stosu. AbythisType, typptrmusi być wskaźnikiem zarządzanym (&). Należy pamiętać, że różni się to od przypadku nieprefiksowanej instrukcjicallvirt, która oczekuje odwołaniathisType.Argumenty metody
arg1przezargNsą wypychane do stosu, podobnie jak w przypadku nieprefiksowanej instrukcjicallvirt.
Prefiks constrained został zaprojektowany tak, aby umożliwić wykonywanie instrukcji callvirt w jednolity sposób niezależnie od tego, czy thisType jest typem wartości, czy typem referencyjnym.
Gdy instrukcja callvirtmethod została poprzedzona constrainedthisType, instrukcja jest wykonywana w następujący sposób:
Jeśli
thisTypejest typem odwołania (w przeciwieństwie do typu wartości),ptrjest wyłuszczone i przekazywane jako wskaźnik "ten" docallvirtmethod.Jeśli
thisTypejest typem wartości ithisTypeimplementujemethod,ptrjest przekazywana niezmodyfikowana jako wskaźnik "ten" do instrukcjicallmethodw celu implementacjimethodprzezthisType.Jeśli
thisTypejest typem wartości ithisTypenie implementujemethod,ptrjest wyłuszczone, w polu i przekazywane jako wskaźnik "this" do instrukcjicallvirtmethod.
Ten ostatni przypadek może wystąpić tylko wtedy, gdy method został zdefiniowany w Object, ValueTypelub Enum i nie jest zastępowany przez thisType. W tym przypadku boxing powoduje utworzenie kopii oryginalnego obiektu. Jednak ponieważ żadna z metod Object, ValueTypei Enum modyfikować stanu obiektu, nie można wykryć tego faktu.
Prefiks constrained obsługuje generatory IL, które tworzą kod ogólny. Zwykle instrukcja callvirt jest nieprawidłowa dla typów wartości. Zamiast tego wymagane jest, aby kompilatory IL skutecznie wykonywać przekształcenia "to" opisane powyżej w czasie kompilacji, w zależności od typu ptr i wywoływanej metody. Jeśli jednak ptr jest typem ogólnym nieznanym w czasie kompilacji, nie można wykonać tej transformacji w czasie kompilacji.
Kod constrained umożliwia kompilatorom IL wykonywanie wywołania funkcji wirtualnej w jednolity sposób niezależnie od tego, czy ptr jest typem wartości, czy typem odwołania. Chociaż jest przeznaczona dla sytuacji, w której thisType jest zmienną typową, prefiks constrained działa również dla typów niegenerycznych 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 wersją typów wartości. Jeśli prefiks constrained nie jest używany, w zależności od tego, czy typ wartości zastępuje metodę System.Object, należy emitować różne il. Jeśli na przykład typ wartości V zastąpi metodę Object.ToString(), jest emitowana instrukcja callV.ToString(); jeśli tak nie jest, jest emitowana instrukcja box i instrukcja callvirtObject.ToString(). Problem z przechowywaniem wersji może wystąpić w poprzednim przypadku, jeśli zastąpienie zostanie później usunięte, a w drugim przypadku, jeśli przesłonięcia zostanie później dodane.
Prefiks constrained może być również używany do wywoływania metod interfejsu dla typów wartości, ponieważ metoda typu wartości implementuje metodę interfejsu można zmienić przy użyciu MethodImpl. Jeśli prefiks constrained nie jest używany, kompilator jest zmuszony do wybrania metod typu wartości, które mają być powiązane w czasie kompilacji. Użycie prefiksu constrained umożliwia zestawowi MSIL powiązanie z metodą, która implementuje metodę interfejsu w czasie wykonywania, a nie w czasie kompilacji.
Następujące przeciążenie metody Emit może używać constrained opcode: