Question Ordre des éléments dans les classes: champs, propriétés, constructeurs, méthodes


Existe-t-il une directive C # officielle pour l’ordre des articles en termes de structure de classe?

Ça va:

  • Champs publics
  • Champs privés
  • Propriétés
  • Constructeurs
  • Méthodes
    ?

Je suis curieux de savoir s'il existe une règle stricte concernant l'ordre des articles? Je suis un peu partout. Je veux m'en tenir à une norme particulière pour pouvoir le faire partout.

Le vrai problème est que mes propriétés plus complexes finissent par ressembler beaucoup à des méthodes et qu'elles se sentent hors de propos en haut avant le constructeur.

Des conseils / suggestions?


478
2017-09-29 20:23


origine


Réponses:


Selon le Documentation des règles StyleCop la commande est la suivante.

Dans une classe, une structure ou une interface: (SA1201 et SA1203)

  • Champs constants
  • Des champs
  • Constructeurs
  • Finalizers (Destructeurs)
  • Les délégués
  • Événements
  • Enums
  • Interfaces
  • Propriétés
  • Indexeurs
  • Méthodes
  • Structs
  • Des classes

Dans chacun de ces groupes, ordre par accès: (SA1202)

  • Publique
  • interne
  • protégé interne
  • protégé
  • privé

Dans chacun des groupes d'accès, trier par statique, puis non statique: (SA1204)

  • statique
  • non statique

Dans chacun des groupes de champs statiques / non statiques, ordre par readonly, puis non-readonly: (SA1214 et SA1215)

  • lecture seulement
  • en lecture seule

Une liste déroulée comporte 130 lignes, donc je ne vais pas la dérouler ici. La partie des méthodes déroulée est:

  • méthodes statiques publiques
  • méthodes publiques
  • méthodes statiques internes
  • méthodes internes
  • Méthodes statiques internes protégées
  • méthodes internes protégées
  • méthodes statiques protégées
  • méthodes protégées
  • méthodes statiques privées
  • méthodes privées

La documentation note que si l'ordre prescrit ne convient pas - disons, plusieurs interfaces sont implémentées, et les méthodes et les propriétés d'interface doivent être regroupées - puis utilisez une classe partielle pour regrouper les méthodes et les propriétés associées.


674
2017-11-22 06:41



Plutôt que de regrouper par visibilité ou par type d'élément (champ, propriété, méthode, etc.), que diriez-vous de regrouper par fonctionnalité?


30
2017-09-29 20:30



Je recommande d'utiliser les normes de codage de IDesign ou ceux énumérés sur Le site de Brad Abram. Ce sont les deux meilleurs que j'ai trouvés.

Brad dirait ...

Le membre Classes doit être alphabétisé et regroupé en sections (Champs, Constructeurs, Propriétés, Événements, Méthodes, Implémentations d'interfaces privées, Types imbriqués)


13
2017-09-29 20:30



Ceci est une question ancienne mais toujours très pertinente, alors j'ajouterai ceci: Quelle est la première chose que vous recherchez lorsque vous ouvrez un fichier de classe que vous avez peut-être lu ou non? Des champs? Propriétés? J'ai réalisé par expérience que presque toujours je pars à la recherche des constructeurs, parce que la chose la plus fondamentale à comprendre est comment cet objet est construit.

Par conséquent, j'ai commencé par mettre les constructeurs au premier plan dans les fichiers de classe, et le résultat a été psychologiquement très positif. La recommandation standard de placer les constructeurs après un tas d'autres choses est dissonante.

La fonction de constructeur primaire à venir dans C # 6 fournit la preuve que le lieu naturel d’un constructeur est tout à fait au sommet d’une classe - en fait, les constructeurs primaires sont spécifiés avant même l’accolade ouverte.

C'est marrant à quel point une telle réorganisation fait une différence. Cela me rappelle comment using instructions utilisées pour être commandées - avec les espaces de noms System en premier. La commande "Organize Usings" de Visual Studio utilisait cet ordre. À présent usingLes commandes sont classées par ordre alphabétique, sans traitement particulier des espaces de noms du système. Le résultat est plus simple et plus propre.


12
2018-01-17 09:00



Je ne connais pas une norme de langue ou de secteur, mais j'ai tendance à mettre les choses dans cet ordre avec chaque section enveloppée dans une région:

en utilisant des instructions

Espace de noms

Classe

Membres privés

Propriétés publiques

Constructeurs

Méthodes publiques

Méthodes privées


8
2017-09-29 20:30



Comme mentionné précédemment, il n'y a rien dans le langage C # qui dicte la mise en page, j'utilise personnellement les régions et je fais quelque chose comme ça pour une classe moyenne.

public class myClass
{
#region Private Members

#endregion
#region Public Properties

#endregion

#region Constructors

#endregion
#region Public Methods

#endregion
}

Cela a du sens pour moi de toute façon


4
2017-09-29 20:31



De StyleCop

champs privés, champs publics, constructeurs, propriétés, méthodes publiques, méthodes privées

Comme StyleCop fait partie du processus de construction de MS, vous pouvez le voir comme un standard de facto


3
2017-09-29 20:30



Habituellement, j'essaie de suivre le modèle suivant:

  • membres statiques (ont généralement un autre contexte, doivent être thread-safe, etc.)
  • membres d'instance

Chaque partie (statique et instance) comprend les types de membres suivants:

  • opérateurs (sont toujours statiques)
  • champs (initialisés avant les constructeurs)
  • constructeurs
  • destructeur (est une tradition de suivre les constructeurs)
  • Propriétés
  • méthodes
  • événements

Ensuite, les membres sont triés par visibilité (de moins en plus visible):

  • privé
  • interne
  • protection interne
  • protégé
  • Publique

L'ordre n'est pas un dogme: les classes simples sont plus faciles à lire, cependant, les classes plus complexes nécessitent un regroupement spécifique au contexte.


3
2017-09-29 20:40