Udostępnij za pośrednictwem


OpCodes.Constrained Pole

Definicja

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:

  1. Zarządzany wskaźnik, ptr, jest wypychany do stosu. Aby thisType, typ ptr musi być wskaźnikiem zarządzanym (&). Należy pamiętać, że różni się to od przypadku nieprefiksowanej instrukcji callvirt, która oczekuje odwołania thisType.

  2. Argumenty metody arg1 przez argN są wypychane do stosu, podobnie jak w przypadku nieprefiksowanej instrukcji callvirt.

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 thisType jest typem odwołania (w przeciwieństwie do typu wartości), ptr jest wyłuszczone i przekazywane jako wskaźnik "ten" do callvirtmethod.

  • Jeśli thisType jest typem wartości i thisType implementuje method, ptr jest przekazywana niezmodyfikowana jako wskaźnik "ten" do instrukcji callmethod w celu implementacji method przez thisType.

  • Jeśli thisType jest typem wartości i thisType nie implementuje method, ptr jest wyłuszczone, w polu i przekazywane jako wskaźnik "this" do instrukcji callvirtmethod.

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:

Dotyczy