OpCodes.Constrained Feld
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Beschränkt den Typ, für den ein virtueller Methodenaufruf ausgeführt wird.
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
Feldwert
Hinweise
Die folgende Tabelle enthält das Hexadezimal- und Microsoft MSIL-Assemblyformat (Intermediate Language) der Anweisung sowie eine kurze Referenzzusammenfassung:
| Format | Assemblyformat | Description |
|---|---|---|
FE 16 <T> |
Eingeschränkt. thisType |
Rufen Sie eine virtuelle Methode für einen Typ auf, der auf den Typ Tbeschränkt ist. |
Das constrained Präfix ist nur für eine callvirt Anweisung zulässig.
Der Zustand des MSIL-Stapels an diesem Punkt muss wie folgt sein:
Ein verwalteter Zeiger
ptrwird auf den Stapel verschoben. Der Typ vonptrmuss ein verwalteter Zeiger (&) aufthisType. Beachten Sie, dass dies anders ist als bei einer unvoreingestelltencallvirtAnweisung, die einen Verweis vonthisType.Methodenargumente
arg1argNwerden auf den Stapel verschoben, genau wie bei einer nicht voreingestelltencallvirtAnweisung.
Das constrained Präfix ist so konzipiert, dass callvirt Anweisungen auf einheitliche Weise erfolgen können, unabhängig davon, ob thisType es sich um einen Werttyp oder einen Bezugstyp handelt.
Wenn eine callvirtmethod Anweisung einem Präfix vorangestellt constrainedthisTypewurde, wird die Anweisung wie folgt ausgeführt:
Wenn
thisTypees sich um einen Bezugstyp (im Gegensatz zu einem Werttyp) handelt,ptrwird dieser abgeleitet und als "this"-Zeiger an dencallvirtWertmethodübergeben.Wenn
thisTypees sich um einen Werttyp handelt undthisTypeimplementiertmethodwird,ptrwird der Zeiger "this" als "this"-Zeiger fürcallmethoddie Implementierung vonmethodbythisTypeübergeben.Wenn
thisTypees sich um einen Werttyp handelt undthisTypenicht implementiertmethodptrwird, wird dieser abgeleitet, boxed und als "this"-Zeiger an diecallvirtmethodAnweisung übergeben.
Dieser letzte Fall kann nur auftreten, wenn method er für Object, ValueTypeoder Enum nicht überschrieben wurde.thisType In diesem Fall bewirkt das Boxen, dass eine Kopie des ursprünglichen Objekts erstellt wird. Da jedoch keine der Methoden des ObjectObjekts , ValueTypeund Enum der Zustand des Objekts geändert wird, kann diese Tatsache nicht erkannt werden.
Das constrained Präfix unterstützt IL-Generatoren, die generischen Code erstellen. Normalerweise ist die callvirt Anweisung für Werttypen ungültig. Stattdessen ist es erforderlich, dass IL-Compiler die oben beschriebene Transformation zur Kompilierungszeit effektiv ausführen, abhängig vom Typ und ptr der aufgerufenen Methode. Wenn ptr es sich jedoch um einen generischen Typ handelt, der zur Kompilierungszeit unbekannt ist, ist es nicht möglich, diese Transformation zur Kompilierungszeit zu erstellen.
Mit dem constrained Opcode können IL-Compiler eine virtuelle Funktion auf einheitliche Weise aufrufen, unabhängig davon, ob ptr es sich um einen Werttyp oder einen Verweistyp handelt. Obwohl sie für den Fall vorgesehen ist, dass thisType es sich um eine generische Typvariable handelt, funktioniert das constrained Präfix auch für nichtgenerische Typen und kann die Komplexität des Generierens virtueller Aufrufe in Sprachen verringern, die den Unterschied zwischen Werttypen und Verweistypen ausblenden.
Durch die Verwendung des constrained Präfixes werden auch potenzielle Versionsverwaltungsprobleme mit Werttypen vermieden. Wenn das constrained Präfix nicht verwendet wird, muss je nachdem, ob ein Werttyp eine Methode von System.Object überschreibt, unterschiedliche IL-Werte ausgegeben werden. Wenn z. B. ein Werttyp V die Object.ToString()-Methode außer Kraft setzt, wird einecallV.ToString()Anweisung ausgegeben. Andernfalls wird eine box Anweisung und eine callvirtObject.ToString() Anweisung ausgegeben. Ein Versionsverwaltungsproblem kann im früheren Fall auftreten, wenn die Außerkraftsetzung später entfernt wird, und im letzteren Fall, wenn eine Außerkraftsetzung später hinzugefügt wird.
Das constrained Präfix kann auch zum Aufrufen von Schnittstellenmethoden für Werttypen verwendet werden, da die Werttypmethode, die die Schnittstellenmethode implementiert, mithilfe einer geändert MethodImplwerden kann. Wenn das constrained Präfix nicht verwendet wird, wird der Compiler gezwungen, auszuwählen, an welche Methoden des Werttyps zur Kompilierungszeit gebunden werden sollen. Die Verwendung des constrained Präfixes ermöglicht dem MSIL die Bindung an die Methode, die die Schnittstellenmethode zur Laufzeit implementiert, anstatt zur Kompilierungszeit.
Die folgende Emit Methodenüberladung kann den constrained Opcode verwenden: