Règles de conception
Les règles de conception assurent le respect des directives de conception .NET Framework.
Contenu de cette section
Règle | Description |
---|---|
CA1000 : Ne pas déclarer de membres statiques sur les types génériques | Lorsqu’un membre statique d’un type générique est appelé, l’argument de type doit être spécifié pour le type. Lorsqu’un membre d’instance générique qui ne prend pas en charge l’inférence est appelé, l’argument de type doit être spécifié pour le membre. Dans ces deux cas, la syntaxe permettant de spécifier l’argument de type est différente et facilement confondue. |
CA1001 : Les types qui possèdent des champs supprimables doivent être supprimables | Une classe déclare et implémente un champ d’instance qui est un type System.IDisposable et la classe n’implémente pas IDisposable. Classe qui déclare un champ IDisposable possède indirectement une ressource non managée et doit implémenter l’interface IDisposable. |
CA1002 : n’exposez pas de listes génériques | System.Collections.Generic.List<(Of <(T>)>) est une collection générique conçue pour les performances et non l’héritage. Par conséquent, List ne contient aucun membre virtuel. Les collections génériques conçues pour l’héritage doivent être exposées à la place. |
CA1003 : Utiliser des instances de gestionnaire d’événements génériques | Un type contient un délégué qui renvoie void, dont la signature contient deux paramètres (le premier un objet et le second un type assignable à EventArgs), et l'assemblage contenant cible le framework .NET 2.0. |
CA1005 : Évitez les paramètres excessifs sur les types génériques | Plus les paramètres de type qu’un type générique contient, plus il est difficile de savoir et de mémoriser ce que chaque paramètre de type représente. Il est généralement évident avec un paramètre de type, comme dans List<T>, et dans certains cas avec deux paramètres de type, comme dans Dictionary<TKey, TValue>. Toutefois, si plus de deux paramètres de type existent, la difficulté devient trop grande pour la plupart des utilisateurs. |
CA1008 : les énumérations doivent avoir une valeur nulle | La valeur par défaut d’une énumération non initialisée, tout comme les autres types valeur, est zéro. Une énumération attributée nonflags doit définir un membre à l’aide de la valeur zéro afin que la valeur par défaut soit une valeur valide de l’énumération. Si une énumération dont l’attribut FlagsAttribute est appliqué définit un membre à valeur nulle, son nom doit être « None » pour indiquer qu’aucune valeur n’a été définie dans l’énumération. |
CA1010 : Les collections doivent implémenter l’interface générique | Pour élargir la facilité d’utilisation d’une collection, implémentez l’une des interfaces de collection générique. Ensuite, la collection peut être utilisée pour remplir les types de collections génériques. |
CA1012 : Les types abstraits ne doivent pas avoir de constructeurs publics | Les constructeurs sur les types abstraits peuvent être appelés uniquement par des types dérivés. Étant donné que les constructeurs publics créent des instances d’un type et que vous ne pouvez pas créer d’instances d’un type abstrait, un type abstrait qui a un constructeur public est mal conçu. |
CA1014 : Marquer les assemblys avec CLSCompliantAttribute | La spécification clS (Common Language Specification) définit des restrictions d’affectation de noms, des types de données et des règles auxquelles les assemblys doivent être conformes s’ils seront utilisés dans les langages de programmation. Une bonne conception exige que tous les assemblies indiquent explicitement la conformité au CLS à l’aide de CLSCompliantAttribute. Si cet attribut n’est pas présent sur un assembly, l’assembly n’est pas conforme. |
CA1016 : Marquer des assemblys avec AssemblyVersionAttribute | .NET utilise le numéro de version pour identifier un assembly de manière unique et pour lier des types dans des assemblys fortement nommés. Le numéro de version est utilisé conjointement avec la version et la stratégie d'éditeur. Par défaut, les applications s’exécutent uniquement avec la version d’assembly avec laquelle elles ont été générées. |
CA1017 : Marquer des assemblys avec ComVisibleAttribute | ComVisibleAttribute détermine comment les clients COM accèdent au code managé. Un bon design stipule que les assemblys indiquent explicitement la visibilité COM. La visibilité COM peut être définie pour l'assembly en entier, puis être substituée pour des types et des membres de type individuels. Si cet attribut n’est pas présent, le contenu de l’assembly est visible par les clients COM. |
CA1018 : Marquer les attributs avec AttributeUsageAttribute | Lorsque vous définissez un attribut personnalisé, marquez-le à l’aide d’AttributeUsageAttribute pour indiquer où, dans le code source, l’attribut personnalisé peut être appliqué. La signification et l’utilisation prévue d’un attribut déterminent ses emplacements valides dans le code. |
CA1019 : définir des accesseurs pour les arguments d’attribut | Les attributs peuvent définir des arguments obligatoires qui doivent être spécifiés lorsque vous appliquez l’attribut à une cible. Ces arguments sont également appelés arguments positionnels, car ils sont fournis aux constructeurs d’attributs en tant que paramètres positionnels. Pour chaque argument obligatoire, l’attribut doit également fournir une propriété en lecture seule correspondante afin que la valeur de l’argument puisse être récupérée au moment de l’exécution. Les attributs peuvent également définir des arguments facultatifs, également appelés arguments nommés. Ces arguments sont fournis aux constructeurs d’attributs par nom et doivent avoir une propriété en lecture/écriture correspondante. |
CA1021 : Éviter les paramètres out | Passer des types par référence (en utilisant out ou ref) nécessite une certaine expérience des pointeurs, de comprendre la différence entre les types valeur et les types référence, ainsi que la gestion de méthodes impliquant plusieurs valeurs de retour. En outre, la différence entre les paramètres out et ref n’est pas largement comprise. |
CA1024 : Utilisez les propriétés le cas échéant | Une méthode publique ou protégée a un nom qui commence par « Get », ne prend aucun paramètre et retourne une valeur qui n’est pas un tableau. La méthode est susceptible de devenir une propriété. |
CA1027 : Marquer les enums avec FlagsAttribute | Une énumération est un type valeur qui définit un ensemble de constantes nommées associées. Appliquez FlagsAttribute à une énumération lorsque ses constantes nommées peuvent être combinées de manière significative. |
CA1028 : Le stockage enum doit être Int32 | Une énumération est un type valeur qui définit un ensemble de constantes nommées associées. Par défaut, le type de données System.Int32 est utilisé pour stocker la valeur constante. Même si vous pouvez modifier ce type sous-jacent, il n’est pas nécessaire ou recommandé pour la plupart des scénarios. |
CA1030 : Utiliser des événements lorsque cela est approprié | Cette règle détecte les méthodes dont les noms sont habituellement utilisés pour des événements. Si une méthode est appelée en réponse à une modification d’état clairement définie, la méthode doit être appelée par un gestionnaire d’événements. Les objets qui appellent la méthode doivent déclencher des événements au lieu d’appeler la méthode directement. |
CA1031 : Ne pas intercepter des types d'exception générale | Les exceptions générales ne doivent pas être interceptées. Interceptez une exception plus spécifique ou levez à nouveau l'exception générale en tant que dernière instruction dans le bloc catch. |
CA1032 : Implémenter des constructeurs d’exceptions standard | L’échec de la fourniture de l’ensemble complet de constructeurs peut rendre difficile la gestion correcte des exceptions. |
CA1033 : Les méthodes d'interface doivent pouvoir être appelées par les types enfants | Un type visible en externe non scellé fournit une implémentation de méthode explicite d’une interface publique et ne fournit pas une autre méthode visible en externe portant le même nom. |
CA1034 : Les types imbriqués ne doivent pas être visibles | Un type imbriqué représente un type déclaré dans la portée d'un autre type. Les types imbriqués sont utiles pour encapsuler les détails de l'implémentation privée du type conteneur. Utilisés à cet effet, les types imbriqués ne doivent pas être visibles en externe. |
CA1036 : Substituer les méthodes sur les types Comparable | Un type public ou protégé implémente l’interface System.IComparable. Il ne substitue pas Object.Equals, ni ne surcharge l'opérateur égal à, différent de, inférieur à ou supérieur à propre au langage. |
CA1040 : Éviter les interfaces vides | Les interfaces définissent des membres qui fournissent un comportement ou un contrat d’utilisation. Les fonctionnalités décrites par l’interface peuvent être adoptées par n’importe quel type, quel que soit l’emplacement où le type apparaît dans la hiérarchie d’héritage. Un type implémente une interface en fournissant des implémentations pour les membres de l’interface. Une interface vide ne définit aucun membre ; par conséquent, elle ne définit pas de contrat qui peut être implémenté. |
CA1041 : Fournir un message ObsoleteAttribute | Un type ou un membre est marqué à l’aide d’un attribut System.ObsoleteAttribute qui n’a pas sa propriété ObsoleteAttribute.Message spécifiée. Lorsqu’un type ou un membre marqué à l’aide d’ObsoleteAttribute est compilé, la propriété Message de l’attribut s’affiche, ce qui donne à l’utilisateur des informations sur le type ou le membre obsolètes. |
CA1043 : Utiliser un argument de type entier ou chaîne pour les indexeurs | Les indexeurs (autrement dit, les propriétés indexées) doivent utiliser des types intégral ou de chaîne pour l’index. Ces types sont généralement utilisés pour l’indexation des structures de données et augmentent la facilité d’utilisation de la bibliothèque. L’utilisation du type Objet doit être limitée aux cas où le type intégral ou chaîne spécifique ne peut pas être spécifié au moment du design. |
CA1044 : Les propriétés ne doivent pas être en écriture seule | Bien qu’il soit acceptable et souvent nécessaire d’avoir une propriété en lecture seule, les instructions de conception interdisent l’utilisation de propriétés en écriture seule. Cela est dû au fait que permettre à un utilisateur de définir une valeur, puis l'empêcher de voir cette valeur, ne fournit aucune sécurité. En outre, sans accès en lecture, l’état des objets partagés ne peut pas être consulté, ce qui limite leur utilité. |
CA1045 : Ne pas passer de types par référence | La transmission de types par référence (en utilisant out ou ref) nécessite une expérience avec les pointeurs, une compréhension de la différence entre les types de valeur et les types de référence, ainsi que la gestion des méthodes avec plusieurs valeurs de retour. Les architectes de bibliothèque qui conçoivent pour un public général ne doivent pas s’attendre à ce que les utilisateurs soient compétents pour travailler avec des paramètres out ou ref. |
CA1046 : Ne pas surcharger l'opérateur égal à sur les types référence | Pour les types de référence, l’implémentation par défaut de l’opérateur d’égalité est presque toujours correcte. Par défaut, deux références sont égales uniquement si elles pointent vers le même objet. |
CA1047 : Ne pas déclarer les membres protégés dans les types sealed | Les types déclarent des membres protégés afin que des types qui héritent puissent accéder au membre ou le substituer. Par définition, les types scellés ne peuvent pas être hérités, ce qui signifie que les méthodes protégées sur les types scellés ne peuvent pas être appelées. |
CA1050 : Déclarer les types dans des espaces de noms | Les types sont déclarés dans les espaces de noms pour empêcher les collisions de noms et comme moyen d’organiser les types associés dans une hiérarchie d’objets. |
CA1051 : Ne déclarez pas les champs d’instance visibles | Un champ s'utilise principalement en tant que détail d'implémentation. Les champs doivent être privés ou internes, et doivent être exposés au moyen de propriétés. |
CA1052 : Les types de conteneurs statiques doivent être étanches | Un type public ou protégé contient uniquement des membres statiques et n’est pas déclaré à l’aide du modificateur sealed (C#) ou NotInheritable (Visual Basic). Un type qui n’est pas destiné à être hérité doit être marqué à l’aide du modificateur scellé pour empêcher son utilisation comme type de base. |
CA1053 : Les types de conteneurs statiques ne doivent pas comporter de constructeur | Un type public ou imbriqué déclare uniquement les membres statiques et possède un constructeur par défaut public ou protégé. Le constructeur est inutile car l'appel à des membres statiques ne requiert aucune instance du type. La surcharge de chaîne doit appeler la surcharge d'URI (Uniform Resource Identifier) à l'aide de l'argument de chaîne pour des raisons de sécurité. |
CA1054 : les paramètres d’URI ne doivent pas être des chaînes | Si une méthode prend une représentation sous forme de chaîne d’un URI, une surcharge correspondante doit être fournie qui prend une instance de la classe URI, qui fournit ces services de manière sécurisée. |
CA1055 : Les valeurs de retour d’URI ne doivent pas être des chaînes | Cette règle suppose que la méthode retourne un URI. Une représentation sous forme de chaîne d’un URI est sujette à des erreurs d’analyse et d’encodage, et peut entraîner des vulnérabilités de sécurité. La classe System.Uri fournit ces services de manière sûre et sécurisée. |
CA1056 : Les propriétés d’URI ne doivent pas être des chaînes | Cette règle suppose que la propriété représente un URI. Une représentation sous forme de chaîne d’un URI est sujette à des erreurs d’analyse et d’encodage, et peut entraîner des vulnérabilités de sécurité. La classe System.Uri fournit ces services de façon sécurisée et fiable. |
CA1058 : Les types ne doivent pas étendre certains types de base | Un type visible en externe étend certains types de base. Utilisez l’une des alternatives. |
CA1060 : Déplacer P/Invokes vers la classe NativeMethods | Méthodes d’appel de plateforme, telles que celles marquées avec le System.Runtime.InteropServices.DllImportAttribute ou les méthodes définies à l’aide du mot clé Declare dans Visual Basic, accèdent au code non managé. Ces méthodes doivent être de la classe NativeMethods, SafeNativeMethods ou UnsafeNativeMethods. |
CA1061 : ne masquez pas les méthodes de classe de base | Une méthode dans un type de base est masquée par une méthode nommée identiquement dans un type dérivé, lorsque la signature de paramètre de la méthode dérivée diffère uniquement par les types qui sont plus faiblement dérivés que les types correspondants dans la signature de paramètre de la méthode de base. |
CA1062 : Valider les arguments des méthodes publiques | Tous les arguments de référence passés à des méthodes visibles en externe doivent être vérifiés par rapport à null. |
CA1063 : Implémenter IDisposable correctement | Tous les types IDisposable doivent implémenter le modèle Dispose correctement. |
CA1064 : Les exceptions doivent être publiques | Une exception interne est visible uniquement à l’intérieur de sa propre étendue interne. Une fois que l’exception se trouve en dehors de l’étendue interne, seule l’exception de base peut être utilisée pour intercepter l’exception. Si l’exception interne est héritée de System.Exception, System.SystemExceptionou System.ApplicationException, le code externe n’aura pas suffisamment d’informations pour savoir quoi faire avec l’exception. |
CA1065 : ne déclenchez pas d’exceptions dans des emplacements inattendus | Une méthode dont l'objet n'est pas de lever des exceptions lève une exception. |
CA1066 : Implémenter IEquatable au moment de remplacer Equals | Un type valeur remplace Equals méthode, mais n’implémente pas IEquatable<T>. |
CA1067: Remplacer Equals lors de l’implémentation d’IEquatable | Un type implémente IEquatable<T>, mais ne remplace pas Equals méthode. |
CA1068 : Les paramètres CancellationToken doivent venir en dernier | Une méthode a un paramètre CancellationToken qui n’est pas le dernier paramètre. |
CA1069 : Les énumérations ne doivent pas avoir de valeurs en double | Une énumération a plusieurs membres qui sont explicitement affectés à la même valeur constante. |
CA1070 : ne déclarez pas les champs d’événement comme virtuels | Un événement de type champ a été déclaré comme virtuel. |
Collaborer avec nous sur GitHub
La source de ce contenu se trouve sur GitHub, où vous pouvez également créer et examiner des problèmes et des demandes de tirage (pull requests). Pour plus d’informations, consultez notre guide du contributeur.