Regras de design
As regras de design dão suporte à adesão às diretrizes de design do .NET Framework .
Nesta seção
Regra | Descrição |
---|---|
CA1000: Não declarar membros estáticos em tipos genéricos | Quando um membro estático de um tipo genérico é chamado, o argumento type deve ser especificado para o tipo. Quando um membro de instância genérica que não dá suporte à inferência é chamado, o argumento de tipo deve ser especificado para o membro. Nesses dois casos, a sintaxe para especificar o argumento de tipo é diferente e facilmente confusa. |
CA1001: Tipos que possuem campos descartáveis devem ser descartáveis | Uma classe declara e implementa um campo de instância que é um tipo System.IDisposable e a classe não implementa IDisposable. Uma classe que declara indiretamente um campo IDisposable possui um recurso não gerenciado e deve implementar a interface IDisposable. |
CA1002: Não expor listas genéricas | System.Collections.Generic.List<(Of <(T>)>) é uma coleção genérica projetada para desempenho, não herança. Portanto, a lista não contém membros virtuais. As coleções genéricas projetadas para herança devem ser expostas em seu lugar. |
CA1003: usar instâncias genéricas do manipulador de eventos | Um tipo contém um delegado que retorna void, cuja assinatura contém dois parâmetros (o primeiro um objeto e o segundo um tipo atribuível a EventArgs) e o assembly que o contém tem o .NET Framework 2.0 como destino. |
CA1005: evite parâmetros excessivos em tipos genéricos | Quanto mais parâmetros de tipo um tipo genérico contiver, mais difícil é saber e lembrar o que cada parâmetro de tipo representa. Geralmente, é óbvio com um parâmetro de tipo, como em List<T>e, em determinados casos, com dois parâmetros de tipo, como no Dicionário<TKey, TValue>. No entanto, se houver mais de dois parâmetros de tipo, a dificuldade se tornará muito grande para a maioria dos usuários. |
CA1008: Enums devem ter valor zero | O valor padrão de uma enumeração não inicializada, assim como outros tipos de valor, é zero. Uma enumeração atribuída nonflags deve definir um membro usando o valor zero para que o valor padrão seja um valor válido da enumeração. Se uma enumeração que tem o atributo FlagsAttribute aplicado definir um membro com valor zero, seu nome deverá ser "Nenhum" para indicar que nenhum valor foi definido na enumeração. |
CA1010: Coleções devem implementar uma interface genérica | Para ampliar a usabilidade de uma coleção, implemente uma das interfaces de coleção genéricas. Em seguida, a coleção pode ser usada para preencher tipos de coleção genéricos. |
CA1012: tipos abstratos não devem ter construtores públicos | Construtores em tipos abstratos só podem ser chamados por tipos derivados. Como construtores públicos criam instâncias de um tipo e você não pode criar instâncias de um tipo abstrato, um tipo abstrato que tem um construtor público é projetado incorretamente. |
CA1014: Marcar assemblies com CLSCompliantAttribute | A CLS (Common Language Specification) define restrições de nomenclatura, tipos de dados e regras às quais os assemblies devem estar em conformidade se forem usados entre linguagens de programação. Um bom design exige que todos os assemblies indiquem explicitamente a conformidade com a CLS usando o atributo CLSCompliantAttribute. Se esse atributo não estiver presente em um assembly, o assembly não será compatível. |
CA1016: Marcar assemblies com AssemblyVersionAttribute | O .NET usa o número da versão para identificar exclusivamente um assembly e fazer a associação com tipos em assemblies fortemente nomeados. O número de versão é usado com a versão e a política do publicador. Por padrão, os aplicativos são executados apenas com a versão do assembly com a qual foram criados. |
CA1017: marcar assemblies com ComVisibleAttribute | ComVisibleAttribute determina como os clientes COM acessam o código gerenciado. Um bom design determina que os assemblies indiquem explicitamente a visibilidade de COM. A visibilidade de COM pode ser definida para todo o assembly e, em seguida, substituída por tipos individuais e membros de tipo. Se esse atributo não estiver presente, o conteúdo do assembly estará visível para clientes COM. |
CA1018: Marcar atributos com AttributeUsageAttribute | Ao definir um atributo personalizado, marque-o usando AttributeUsageAttribute para indicar onde, no código-fonte, o atributo personalizado pode ser aplicado. O significado e o uso pretendido de um atributo determinarão seus locais válidos no código. |
CA1019: Definir acessadores para argumentos de atributo | Os atributos podem definir argumentos obrigatórios que devem ser especificados quando você aplica o atributo a um destino. Eles também são conhecidos como argumentos posicionais porque são fornecidos a construtores de atributo como parâmetros posicionais. Para cada argumento obrigatório, o atributo também deve fornecer uma propriedade somente leitura correspondente para que o valor do argumento possa ser recuperado no momento da execução. Os atributos também podem definir argumentos opcionais, que também são conhecidos como argumentos nomeados. Esses argumentos são fornecidos a construtores de atributos por nome e devem ter uma propriedade de leitura/gravação correspondente. |
CA1021: Evitar parâmetros out | Passar tipos por referência (usando out ou ref) requer experiência com ponteiros, entender como tipos de valor e tipos de referência diferem e lidar com métodos com vários valores retornados. Além disso, a diferença entre os parâmetros out e ref não é amplamente compreendida. |
CA1024: Usar propriedades quando apropriado | Um método público ou protegido tem um nome que começa com "Get", não usa parâmetros e retorna um valor que não é uma matriz. O método pode ser um bom candidato a se tornar uma propriedade. |
CA1027: Marcar enumerações com FlagsAttribute | Uma enumeração é um tipo de valor que define um conjunto de constantes nomeadas relacionadas. Aplique FlagsAttribute a uma enumeração quando suas constantes nomeadas puderem ser combinadas significativamente. |
CA1028: O armazenamento de enumerações deve ser Int32 | Uma enumeração é um tipo de valor que define um conjunto de constantes nomeadas relacionadas. Por padrão, o tipo de dados System.Int32 é usado para armazenar o valor constante. Mesmo que você possa alterar esse tipo subjacente, ele não é necessário ou recomendado para a maioria dos cenários. |
CA1030: Usar eventos quando apropriado | Essa regra detecta métodos que têm nomes que normalmente seriam usados para eventos. Se um método for chamado em resposta a uma alteração de estado claramente definida, o método deverá ser invocado por um manipulador de eventos. Os objetos que chamam o método devem gerar eventos em vez de chamar o método diretamente. |
CA1031: Não capturar tipos de exceção geral | As exceções gerais não devem ser capturadas. Capture uma exceção mais específica ou relance a exceção geral como a última instrução no bloco de captura. |
CA1032: implementar construtores de exceção padrão | Deixar de fornecer o conjunto completo de construtores pode dificultar o tratamento correto das exceções. |
CA1033: Métodos de interface devem ser chamados por tipos filho | Um tipo visível externamente sem lacre fornece uma implementação de método explícita de uma interface pública e não fornece um método visível externamente alternativo com o mesmo nome. |
CA1034: Tipos aninhados não devem ser visíveis | Um tipo aninhado é um tipo declarado no escopo de outro tipo. Os tipos aninhados são úteis para encapsular detalhes de implementação privados do tipo de contenção. Usados para essa finalidade, os tipos aninhados não devem ser visíveis externamente. |
CA1036: Substituir métodos em tipos comparáveis | Um tipo público ou protegido implementa a interface System.IComparable. Ele não substitui Object.Equals nem sobrecarrega o operador específico da linguagem para igualdade, desigualdade, menor que ou maior que. |
CA1040: evite interfaces vazias | As interfaces definem membros que fornecem um contrato de comportamento ou de uso. A funcionalidade descrita pela interface pode ser adotada por qualquer tipo, independentemente de onde o tipo aparece na hierarquia de herança. Um tipo implementa uma interface fornecendo implementações para os membros da interface. Uma interface vazia não define nenhum membro; portanto, ele não define um contrato que pode ser implementado. |
CA1041: Fornecer a mensagem ObsoleteAttribute | Um tipo ou membro é marcado usando um atributo System.ObsoleteAttribute que não tem sua propriedade ObsoleteAttribute.Message especificada. Quando um tipo ou membro marcado usando ObsoleteAttribute é compilado, a propriedade Message do atributo é exibida, o que fornece ao usuário informações sobre o tipo ou membro obsoleto. |
CA1043: Usar argumento integral ou de cadeia de caracteres para indexadores | Os indexadores (ou seja, propriedades indexadas) devem usar tipos integrais ou de cadeia de caracteres para o índice. Esses tipos normalmente são usados para indexar estruturas de dados e aumentam a usabilidade da biblioteca. O uso do tipo Objeto deve ser restrito aos casos em que o tipo integral ou de cadeia de caracteres específico não pode ser especificado no momento do design. |
CA1044: Propriedades não devem ser somente gravação | Embora seja aceitável e normalmente necessário ter uma propriedade somente leitura, as diretrizes de design proíbem o uso de propriedades somente gravação. Isso ocorre porque permitir que um usuário defina um valor e, em seguida, impedir que o usuário visualize esse valor, não fornece nenhuma segurança. Além disso, sem acesso de leitura, o estado dos objetos compartilhados não pode ser exibido, o que limita sua utilidade. |
CA1045: Não passar tipos por referência | Passar tipos por referência (usando out ou ref) requer experiência com ponteiros, entender como tipos de valor e tipos de referência diferem e lidar com métodos com vários valores retornados. Os arquitetos de bibliotecas com designs que visam um público geral não devem esperar que os usuários se tornem proficientes em trabalhar com parâmetros out ou ref. |
CA1046: Não sobrecarregar o operador equals em tipos de referência | Para tipos de referência, a implementação padrão do operador de igualdade está quase sempre correta. Por padrão, duas referências serão iguais somente se apontarem para o mesmo objeto. |
CA1047: Não declarar membros protegidos em tipos selados | Os tipos declaram membros protegidos de forma que a herança de tipos possa acessar ou substituir o membro. Por definição, os tipos vedados não podem ser lacrados, o que significa que os métodos protegidos em tipos lacrados não podem ser chamados. |
CA1050: declarar tipos em namespaces | Os tipos são declarados em namespaces para evitar colisões de nome e como uma forma de organizar tipos relacionados em uma hierarquia de objetos. |
CA1051: não declare campos de instância visíveis | O principal uso de um campo deve ser um como um detalhe da implementação. Os campos devem ser privados ou internos e devem ser expostos usando-se propriedades. |
CA1052: os tipos de suporte estático devem ser lacrados | Um tipo público ou protegido contém apenas membros estáticos e não é declarado usando o modificador lacrado (C#) ou NotInheritable (Visual Basic). Um tipo que não deve ser herdado deve ser marcado usando o modificador lacrado para impedir seu uso como um tipo base. |
CA1053: Tipos de suporte estático não devem ter construtores | Um tipo público ou público aninhado declara apenas membros estáticos e tem um construtor padrão público ou protegido. O construtor é desnecessário porque chamar membros estáticos não exige uma instância do tipo. A sobrecarga de cadeia de caracteres deve chamar a sobrecarga do URI (Uniform Resource Identifier) usando-se o argumento de cadeia de caracteres por questões de segurança. |
CA1054: os parâmetros de URI não devem ser cadeias de caracteres | Se um método utiliza uma representação em string de um URI, deve ser fornecida uma sobrecarga correspondente que use uma instância da classe URI, que fornece esses serviços de forma segura e protegida. |
CA1055: os valores retornados do URI não devem ser cadeias de caracteres | Essa regra pressupõe que o método retorna um URI. Uma representação de cadeia de caracteres de um URI é propensa a erros de análise e codificação e pode levar a vulnerabilidades de segurança. A classe System.Uri fornece esses serviços de maneira segura e segura. |
CA1056: as propriedades de URI não devem ser cadeias de caracteres | Essa regra pressupõe que a propriedade representa um URI. Uma representação de cadeia de caracteres de um URI é propensa a erros de análise e codificação e pode levar a vulnerabilidades de segurança. A classe System.Uri fornece esses serviços de maneira segura e segura. |
CA1058: Tipos não devem estender determinados tipos base | Um tipo visível externamente estende determinados tipos de base. Use uma das alternativas. |
CA1060: Mover P/Invokes para a classe NativeMethods | Métodos de invocação de plataforma, como aqueles marcados com o System.Runtime.InteropServices.DllImportAttribute ou métodos definidos usando a palavra-chave Declare no Visual Basic, acessam código não gerenciado. Esses métodos devem ser da classe NativeMethods, SafeNativeMethods ou UnsafeNativeMethods. |
CA1061: Não ocultar métodos de classe base | Um método em um tipo base é ocultado por um método com nome idêntico em um tipo derivado, quando a assinatura de parâmetro do método derivado difere apenas por tipos que são mais fracamente derivados do que os tipos correspondentes na assinatura de parâmetro do método base. |
CA1062: validar argumentos de métodos públicos | Todos os argumentos de referência que são passados para métodos visíveis externamente devem ser verificados em relação a nulo. |
CA1063: Implementar IDisposable corretamente | Todos os tipos IDisposable devem implementar o padrão Dispose corretamente. |
CA1064: as exceções devem ser públicas | Uma exceção interna só é visível dentro de seu próprio escopo interno. Depois que a exceção estiver fora do escopo interno, somente a exceção base poderá ser usada para capturar a exceção. Se a exceção interna for herdada de System.Exception, System.SystemExceptionou System.ApplicationException, o código externo não terá informações suficientes para saber o que fazer com a exceção. |
CA1065: Não acionar exceções em locais inesperados | Um método que não é esperado para gerar exceções gera uma exceção. |
CA1066: Implementar IEquatable ao substituir Equals | Um tipo de valor substitui Equals método, mas não implementa IEquatable<T>. |
CA1067: Substituir Equals ao implementar IEquatable | Um tipo implementa IEquatable<T>, mas não substitui o método Equals. |
CA1068: Os parâmetros CancellationToken devem vir por último | Um método tem um parâmetro CancellationToken que não é o último parâmetro. |
CA1069: Enums não devem ter valores duplicados | Uma enumeração tem vários membros que recebem explicitamente o mesmo valor constante. |
CA1070: Não declarar os campos de evento como virtuais | Um evento do tipo campo foi declarado como virtual. |
Colaborar conosco no GitHub
A fonte deste conteúdo pode ser encontrada no GitHub, onde você também pode criar e revisar problemas e solicitações de pull. Para obter mais informações, confira o nosso guia para colaboradores.