OpCodes.Constrained Champ
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Limite le type sur lequel un appel de méthode virtuelle est effectué.
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
Valeur de champ
Remarques
Le tableau suivant répertorie le format d'assembly hexadécimal et Microsoft (MSIL) de l'instruction, ainsi qu'un bref résumé de référence :
| Format | Format d’assembly | Description |
|---|---|---|
FE 16 <T> |
Contraint. thisType |
Appelez une méthode virtuelle sur un type contraint à être de type T. |
Le constrained préfixe est autorisé uniquement sur une callvirt instruction.
L’état de la pile MSIL à ce stade doit être le suivant :
Un pointeur managé, est
ptrenvoyé (push) sur la pile. Le type deptrdoit être un pointeur managé (&) versthisType. Notez que cela diffère du cas d’une instruction non préfixéecallvirt, qui attend une référence dethisType.Les arguments
arg1de méthode sontargNenvoyés (push) sur la pile, comme avec une instruction non préfixéecallvirt.
Le constrained préfixe est conçu pour permettre callvirt aux instructions d’être effectuées de manière uniforme, indépendamment d’un thisType type valeur ou d’un type référence.
Lorsqu’une instruction a été précédée d’un callvirtmethodconstrainedthisTypepréfixe, l’instruction est exécutée comme suit :
S’il s’agit
thisTyped’un type référence (par opposition à un type valeur),ptril est déréférencé et passé en tant que pointeur « this » à l’objetcallvirtmethod.S’il
thisTypes’agit d’un type valeur etthisTypeimplémentemethod, ilptrest passé non modifié en tant que pointeur « this » vers unemethodcallinstruction, pour l’implémentation demethodparthisType.S’il
thisTypes’agit d’un type valeur etthisTypen’implémentemethodpas,ptril est déréférencé, boxé et passé en tant que pointeur « this » à l’instructioncallvirtmethod.
Ce dernier cas peut se produire uniquement lorsqu’il method a été défini sur Object, ValueTypeou Enum non substitué par thisType. Dans ce cas, la boxe entraîne la création d’une copie de l’objet d’origine. Toutefois, étant donné qu’aucune des méthodes de l’objet, et qu’aucune Enum des méthodes de Objectl’objet ValueTypen’est modifiable, ce fait ne peut pas être détecté.
Le constrained préfixe prend en charge les générateurs IL qui créent du code générique. Normalement, l’instruction callvirt n’est pas valide sur les types valeur. Au lieu de cela, il est nécessaire que les compilateurs IL effectuent efficacement la transformation « this » décrite ci-dessus au moment de la compilation, en fonction du type et de ptr la méthode appelée. Toutefois, lorsqu’il ptr s’agit d’un type générique inconnu au moment de la compilation, il n’est pas possible d’effectuer cette transformation au moment de la compilation.
L’opcode constrained permet aux compilateurs IL d’effectuer un appel à une fonction virtuelle de manière uniforme, indépendamment d’un ptr type valeur ou d’un type référence. Bien qu’il soit destiné au cas où thisType il s’agit d’une variable de type générique, le constrained préfixe fonctionne également pour les types non génériques et peut réduire la complexité de la génération d’appels virtuels dans des langages qui masquent la distinction entre les types valeur et les types de référence.
L’utilisation du constrained préfixe évite également les problèmes potentiels de contrôle de version avec les types valeur. Si le constrained préfixe n’est pas utilisé, différents il doivent être émis selon qu’un type valeur remplace ou non une méthode de System.Object. Par exemple, si un type V valeur remplace la méthode Object.ToString(), une callV.ToString() instruction est émise ; si ce n’est pas le cas, une box instruction et une callvirtObject.ToString() instruction sont émises. Un problème de contrôle de version peut survenir dans l’ancien cas si le remplacement est supprimé ultérieurement et, dans ce dernier cas, si un remplacement est ajouté ultérieurement.
Le constrained préfixe peut également être utilisé pour appeler des méthodes d’interface sur les types valeur, car la méthode de type valeur implémentant la méthode d’interface peut être modifiée à l’aide d’un MethodImpl. Si le constrained préfixe n’est pas utilisé, le compilateur est forcé de choisir les méthodes du type valeur à lier au moment de la compilation. L’utilisation du constrained préfixe permet à MSIL de se lier à la méthode qui implémente la méthode d’interface au moment de l’exécution, plutôt qu’au moment de la compilation.
La surcharge de méthode suivante Emit peut utiliser l’opcode constrained :