4 votes

Comment déclarer un type de valeur en CIL : `.class value` ou simplement `.class` ?

J'ai jeté un coup d'œil à un programme C# struct FooStruct sur ILDASM et j'ai vu ce qui suit :

enter image description here

ILDASM affiche ici deux déclarations différentes :

  • un commençant par .class value public (barre de titre de la fenêtre arrière et de la fenêtre avant)
  • l'un commençant avec juste .class public (fenêtre avant)

Et je me demande quelle syntaxe (si ce n'est les deux) est la bonne pour déclarer un type de valeur ? Est-ce que la syntaxe value strictement nécessaire, ou facultatif, ou encore une erreur de syntaxe ?

3voto

stakx Points 29832

Réponse courte : Les définitions de type de valeur ne nécessitent que extends [mscorlib]System.ValueType ; le value semble être facultatif et n'a aucun effet apparent.

Je suppose que la spécification du CLI ( ECMA-335 ) serait le meilleur endroit pour trouver une réponse faisant autorité.

La définition d'un type de valeur DOIT inclure l'élément value attribut ?

La section II.10 traite de la définition des types. Plus précisément, la sous-section II.10.1.3 stipule :

Les attributs sémantiques de type précisent si une interface, une classe ou un type de valeur doit être défini. Si [l'attribut interface ] n'est pas présent et la définition étend (directement ou indirectement) System.ValueType et la définition n'est pas pour System.Enum un type de valeur doit être défini (§II.13). Sinon, une classe doit être définie (§II.11).

En value Cet attribut n'est pas du tout mentionné dans toute la section.

Conclusion : Une définition correcte de type de valeur ne doit pas nécessairement inclure value . Dérivant de System.ValueType est suffisante.

PEUT-ÊTRE qu'une définition de type de valeur inclut l'élément value modificateur ?

La norme CLI contient également une grammaire pour ILASM (dans la section VI.C.3). Selon cette grammaire, il existe un value attribut pour .class les définitions de type. J'ai également cherché dans la norme des définitions concrètes de types de valeurs et j'ai trouvé ces exemples :

  • .class public sequential ansi serializable sealed beforefieldinit System.Double extends System.ValueType …
  • .class private sealed Rational extends [mscorlib]System.ValueType …
  • .class value sealed public MyClass extends [mscorlib]System.ValueType …

Conclusion : A value peut être inclus dans une définition de type de valeur.

Et que fait le value attribut MEAN ?

J'ai essayé de compiler ces trois définitions de type IL dans un assemblage :

.class       public sealed … A extends [mscorlib]System.ValueType { … }
.class value public sealed … B extends [mscorlib]System.ValueType { … }
.class value public sealed … C extends [mscorlib]System.Object    { … }  // !!!

Il n'y a pas eu d'erreur de compilation, même si le value est utilisé dans une déclaration de type de référence (voir la dernière ligne). L'examen de l'assemblage résultant à l'aide du navigateur d'objets de Visual Studio 2012 révèle deux types de valeurs ( struct ) A y B et un type de référence ( class ) C .

Spéculation : La présence de la value n'a aucun effet sur la définition du type. Il n'est là que pour aider les humains à repérer les définitions de type de valeur.

2voto

csharpfolk Points 2683

Ce grand livre contient de simples réponse : lorsque vous fournissez extends alors la clause value est ignoré, mais si vous ne fournissez pas le paramètre extends et utiliser value alors ilasm déclarera le type donné comme type de valeur.

En d'autres termes value a été introduit comme sucre syntaxique, pour déclarer rapidement le type de valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X