C# - StyleCop - SA1121: UseBuiltInTypeAlias - règles de lisibilité

Ne l'a pas trouvé dans le manuel D'aide de StyleCop, sur SO et Google donc le voici;)

Pendant L'utilisation de StyleCop, j'ai un avertissement:

SA1121-UseBuiltInTypeAlias - Règles De Lisibilité

Le code utilise L'un des C de base# types, mais n'utilise pas le haut- alias pour le type.

Plutôt que d'utiliser le nom de type ou nom de type entièrement qualifié, le alias intégrés pour ces types doit toujours être utilisé: bool, byte, char, décimal, double, court, int, long, objet, sbyte, float, chaîne, ushort, uint, ulong.

, Donc String.Empty est faux (dépendent des règles ci-dessus) et string.Empty est bon.

Pourquoi utiliser des alias intégrés est-il préférable? Peut String. Int32, Int64 (etc.) compliquer quelque chose dans le code sur des scénarios spéciaux?

34
demandé sur akjoshi 2011-05-14 11:48:13

6 réponses

Juste pour clarifier: tout le monde n'est pas d'accord avec les auteurs de StyleCop. Win32 et. net guru Jeffrey Richter écrit dans son excellent livre CLR via C#:

La spécification du langage C# indique: "en tant que question de style, l'utilisation du mot-clé est favorisée par rapport à utilisation du nom complet du type de système."Je ne suis pas d'accord avec la spécification de la langue; je préfère pour utiliser les noms de type FCL et éviter complètement les noms de type primitifs. En fait, je souhaite que les compilateurs ne l'ont pas fait même offrir les noms de type primitifs et forcé les développeurs à utiliser le FCL les noms de type de la place. Voici mes raisons:

  • J'ai vu un certain nombre de développeurs confus, ne sachant pas s'il faut utiliser string ou chaîne dans leur code. Parce que dans C #string (un mot-clé) correspond exactement à Système.String (un type FCL), il n'y a pas de différence et l'un ou l'autre peut être utilisé. Pareillement, J'ai entendu certains développeurs dire que int représente un entier 32 bits lorsque l'application est en cours d'exécution sur un système d'exploitation 32 bits et qu'il représente un entier 64 bits lorsque l'application fonctionne sur un système d'exploitation 64 bits. Cette déclaration est absolument fausse: en C#, Unint correspond toujours à System. Int32 , et donc il représente un entier 32 bits quel que soit le système d'exploitation le code est en cours d'exécution sur. Si les programmeurs utilisent Int32 dans leur code, alors ce potentiel la confusion est également éliminée.

  • En C#, long cartes de Système.Int64, mais dans un autre langage de programmation, long pourrait correspondre à un Int16 ou Int32. En fait, C++ / CLI traite long comme unInt32 . Quelqu'un lisant le code source dans une langue pourrait facilement mal interpréter le code intention s'il ou elle était habitué à programmer dans un langage de programmation différent. En fait, la plupart des langues ne traitent même pas long {[14] } comme un mot-clé et ne compilent pas code qui l'utilise.

  • Le FCL a de nombreuses méthodes qui ont des noms de type dans le cadre de leurs noms de méthodes. Pour exemple, BinaryReader type offre des méthodes telles que ReadBoolean, ReadInt32, ReadSingle, et ainsi de suite, et la Système.Convert Type propose des méthodes telles que ToBoolean, ToInt32, ToSingle, et ainsi de suite. Bien qu'il soit légal d'écrire ce qui suit code, la ligne avec float me semble très contre nature, et ce n'est pas évident que la ligne soit correct:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • De nombreux programmeurs qui utilisent exclusivement C# ont tendance à oublier que d'autres programmes les langages peuvent être utilisés contre le CLR, et à cause de cela, les c#-ismes se glissent dans le classe code de la bibliothèque. Par exemple, le FCL de Microsoft est presque exclusivement écrit en C# et les développeurs de L'équipe FCL ont maintenant introduit des méthodes dans la bibliothèque telles que Tableau GetLongLength, qui retourne un Int64 valeur qui est un long en C# mais pas dans d'autres langages (comme C++/CLI). Un autre exemple est le système .Linq.Énumérable’s méthode LongCount .

52
répondu Andrew Savinykh 2011-05-16 05:00:03

Cela ne compliquerait vraiment le code que si vous aviez le vôtre String, Int32 types etc qui pourraient finir par être utilisés à la place de System.* - et ne le faites pas!

En fin de Compte, c'est une préférence personnelle. J'utilise les alias partout, mais je sais que certaines personnes (par exemple Jeffrey Richter) conseillent de ne jamais les utiliser. C'est probablement une bonne idée d'être cohérent, c'est tout. Si vous n'aimez pas cette règle StyleCop, désactivez-la.

Notez que les noms des méthodes etc doivent utiliser nom du framework plutôt que l'alias, de manière à être neutre en langue. Ce n'est pas si important pour les membres privés / internes, mais vous pourriez aussi bien avoir les mêmes règles pour les méthodes privées que les méthodes publiques.

19
répondu Jon Skeet 2011-05-14 07:52:12

Parce que l'alias intégré est un moyen plus naturel d'exprimer le concept dans cette langue.

Certaines cultures disent football, d'autres disent football. Lequel est le plus approprié dépend du contexte.

1
répondu Esteban Araya 2011-05-14 07:54:02

Cette règle StyleCop suppose que l'utilisation d'alias introduit moins de confusion pour le soi-disant "utilisateur de langue moyen". Qui sait, par exemple, le type 'long', mais en quelque sorte effrayant de type 'System. Int64' et devient confus puis le voit. Personnellement, je pense que c'est important d'être cohérent dans votre style de code, il est impossible de satisfaire tout le monde.

0
répondu Petr Abdulin 2011-05-14 07:59:18

Moins déroutant? Il me semble très intéressant pour un type de données de base, qui n'est traditionnellement qu'une valeur, d'inclure des fonctions statiques. Je comprends utiliser le type de données de base équivalent si vous stockez juste une valeur, mais pour accéder aux membres de la classe, il semble très akward de mettre un .(point) après le nom du type de base.

0
répondu David Hollowell - MSFT 2011-06-01 20:09:50

Une analogie peut aider: Chaîne est à Système.String {[2] } comme mousquet est au fusil. string est une relique d'un ancien langage et est fournie pour les anciens programmeurs. C# n'a pas de types de données "intégrés" et ces alias sont fournis pour une génération de programmeurs 'C' qui ont des problèmes avec ce concept.

0
répondu Donald Airey 2015-07-07 15:21:46