47 votes

L'énumération .NET autorise la virgule dans le dernier champ.

Pourquoi cette énumération .NET est-elle autorisée à avoir une virgule dans le dernier champ ?
Cela a-t-il une signification particulière ?

[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
           Default = 1,
           ReadOnly = 2,
           Optional = 4,
           DelegateProperty = 32,
           Metadata = 8,
           NonSerialized = 16,
}

26 votes

Parce que C# a été conçu par de vrais programmeurs, pas par un comité.

2 votes

Et, C a été conçu par un comité :)

1 votes

J'espère que Dennis Ritchie ne verra pas ce commentaire.

70voto

Nick Craver Points 313913

Il n'a pas de signification particulière, c'est juste la façon dont le compilateur fonctionne, c'est principalement pour cette raison :

[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
           Default = 1,
           ReadOnly = 2,
           Optional = 4,
           DelegateProperty = 32,
           Metadata = 8,
           NonSerialized = 16,
           //EnumPropertyIWantToCommentOutEasily = 32
}

Par demande de commentaires : Cette information provient directement de la Spécification C# (Page 355/Section 17.7)

Comme le C++ standard, le C# autorise une virgule de fin à la fin d'un initialisateur de tableau. Cette syntaxe offre une certaine souplesse dans l'ajout ou la suppression de membres d'une telle liste, et simplifie la génération automatique de telles listes.

3 votes

Le compilateur travaille conformément à la spécification du langage (avec, je pense, quelques exceptions). La grammaire du langage spécifie que la virgule étrangère est légale dans ce cas (et dans quelques autres comme les initialisateurs d'objets, les initialisateurs de collections et les initialisateurs de tableaux). En outre, à moins que vous ne sachiez avec certitude que la grammaire a été conçue pour cette raison, il est probablement plus correct de dire qu'elle donne l'avantage que vous énumérez. Je ne prétends pas connaître les motivations du comité linguistique sans en avoir une connaissance directe.

0 votes

@jason - c'est logique cependant

1 votes

@Jason Pour clarifier, ce n'est pas ma pensée, c'est en fait noté dans la spécification C# : ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf (Page 363/Section 19.7) "Comme le C++ standard, C# autorise une virgule de fin à la fin d'un initialisateur de tableau. Cette syntaxe offre une certaine souplesse dans l'ajout ou la suppression de membres d'une telle liste, et simplifie la génération automatique de telles listes."

14voto

Sergey Teplyakov Points 6556

En outre (pour répondre au message de Nick Craver), il est beaucoup plus facile d'ajouter de nouvelles énumérations.

Ce comportement n'est pas propre aux enums. Considérez ce qui suit :

var list = new int[] { 1, 2, 3, };

10voto

Chris Lively Points 59564

Une autre raison : cela facilite le codage du génie.

5voto

lenilsondc Points 7002

Je sais qu'il s'agit d'un vieux sujet, mais une autre approche qui aurait du sens pour ce problème est celle des systèmes de gestion des versions du code.

Prenons l'exemple suivant :

//version 1
var myArray = {
    "item 1",
    "item 2"
};
//version 2
var myArray = {
    "item 1",
    "item 2", //will be considered a change, it may be considered an erroneous approach
    "item 3"
}

Considérez maintenant cette approche :

//version 1
var myArray = {
    "item 1",
    "item 2",
};
//version 2
var myArray = {
    "item 1",
    "item 2", //will not be considered a change, it may be considered an erroneous approach too, but, means that the code wasn't changed intrinsically
    "item 3",
};

Quoi qu'il en soit, les deux approches peuvent être considérées comme incorrectes ou correctes selon la situation. Je préfère particulièrement la deuxième approche qui est beaucoup plus logique lorsqu'il s'agit de systèmes de gestion de versions de code.

J'espère que cela vous aidera.

2voto

Tim Abell Points 2301

Pourquoi ajouter des virgules de fin

Pourquoi tirer parti de cette fonctionnalité lorsque vous écrivez du code manuellement ?

  1. Les patchs résultants ont moins de lignes affectées. Ils sont donc plus faciles à lire et à réviser.
  2. La fusion automatique et la résolution des conflits sont plus précises car il n'y a pas de bruit supplémentaire pour embrouiller l'algorithme.

Exemples

Sans virgule de fin (ok)

Exemple d'ajout d'une ligne lorsque le développeur précédent n'a pas laissé de virgule de fin :

@@ -119,7 +119,8 @@ namespace SomeApp.Example
   {
     NameTitle = contact.NameTitle,
     GivenName = contact.GivenName,
-    FamilyName = contact.FamilyName
+    FamilyName = contact.FamilyName,
+    ProperName = contact.ProperName
   },
   ContactTelephone1 = contact.ContactTelephone1,
   ContactType = contact.ContactType,

Sans virgule de fin (mieux)


Exemple d'ajout d'une ligne lorsque le développeur précédent a laissé une virgule de fin :

@@ -122,2 +122,3 @@ namespace SomeApp.Example
     FamilyName = contact.FamilyName,
+    ProperName = contact.ProperName,
   },

Notez qu'une ligne a été ajoutée dans le dernier cas, alors qu'une ligne a été supprimée et deux ajoutées. C'est beaucoup plus facile à gérer pour l'homme et la machine.

Pourquoi l'ont-ils ajouté au C# ?

Quant à la raison pour laquelle elle est autorisée, comme dans les autres réponses :

La spécification C# (Page 355/Section 17.7) stipule :

Comme le C++ standard, le C# autorise une virgule de fin à la fin d'un initialisateur de tableau. Cette syntaxe offre une certaine souplesse dans l'ajout ou la suppression de membres d'une telle liste, et simplifie la génération automatique de telles listes.


Cela s'applique aux initialisateurs de tableaux, aux initialisateurs d'objets et aux enums.

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