Avisos de design
Adesão de suporte de avisos de design para o.NET Framework Design Guidelines.
Nesta seção
Regra |
Descrição |
---|---|
Quando um membro estático de um tipo genérico é chamado, o argumento de tipo deve ser especificado para o tipo.Quando um membro de instância genérico que não oferece suporte à inferência de tipos é 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 confundidos. |
|
CA1001: Os tipos que possuem campos descartáveis devem ser descartáveis |
Uma classe declara e implementa um campo de instância é um tipo de IDisposable, e a classe não implementa IDisposable.Uma classe que declara um campo de IDisposable indiretamente possui um recurso não gerenciado e deve implementar a interface IDisposable. |
System.Collections.Generic.List < (de <(T>) >) é uma coleção genérica que foi projetada para desempenho, não a herança.Portanto, a lista não contém nenhum membro virtual.Em vez disso, as coleções genéricas que sejam destinam a herança devem ser expostas. |
|
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 que pode ser atribuído a EventArgs) e os destinos de assembly contendo .NET Framework 2.0. |
|
CA1004: Métodos genéricos devem fornecer o parâmetro de tipo |
Inferência de tipos é como o argumento de tipo de um método genérico é determinado pelo tipo de argumento passado para o método, em vez de pela especificação do argumento de tipo explícita.Para habilitar a inferência de tipos, a assinatura de parâmetro de um método genérico deve incluir um parâmetro que é do mesmo tipo do parâmetro de tipo para o método.Nesse caso, o argumento Tipo não precisa ser especificado.Quando você usa a inferência de tipos para todos os parâmetros de tipo, a sintaxe para chamada dos métodos de instância genéricas e é idêntica; Isso simplifica a usabilidade de métodos genéricos. |
Quanto mais Digite parâmetros que contém um tipo genérico, mais difícil é saber e lembre-se de que cada tipo de parâmetro representa.Ele é geralmente evidente com um parâmetro de tipo, como na lista <T> e, em certos casos com dois parâmetros de tipo, como no Dictionary < TKey, TValue >.No entanto, se existirem em mais de dois parâmetros de tipo, a dificuldade fica muito grande para a maioria dos usuários. |
|
CA1006: Não se aninham tipos genéricos em assinaturas de membros |
Um argumento de tipo aninhado é um argumento de tipo que também é um tipo genérico.Para chamar um membro cuja assinatura contém um argumento de tipo aninhado, o usuário deve criar uma instância de um tipo genérico e passar esse tipo para o construtor de um segundo tipo genérico.O procedimento necessário e a sintaxe são complexas e devem ser evitadas. |
Um método visível externamente contém um parâmetro de referência do tipo Object.Todos os tipos, sujeita às restrições, a serem passados para o método sem a projeção primeiro o tipo para o tipo de parâmetro de referência permite o uso de um método genérico. |
|
O valor padrão de uma enumeração não inicializada, assim como outros tipos de valor é zero.Uma enumeração de nonflags atribuídos deve definir um membro usando o valor de zero para que o valor padrão é um valor válido da enumeração.Se uma enumeração que tem o atributo FlagsAttribute aplicado define um membro com valor zero, seu nome deve ser "Nenhum" para indicar que não há valores foram definidos na enumeração. |
|
Métodos manipuladores de eventos utilizam dois parâmetros.A primeira é do tipo System. Object e é chamada "sender".Este é o objeto que disparou o evento.O segundo parâmetro é do tipo System. EventArgs e é denominado "e".São os dados que está associados com o evento.Métodos de manipulador de eventos não devem retornar um valor; no C# linguagem de programação, isso é indicado pelo tipo de retorno void. |
|
Para ampliar a usabilidade de uma coleção, implemente uma das interfaces de coleção genérica.Em seguida, a coleção pode ser usada para preencher os tipos de coleção genérica. |
|
Quando um tipo base é especificado como um parâmetro em uma declaração de método, qualquer tipo que é derivado do tipo base pode ser passado como o argumento correspondente para o método.Se a funcionalidade adicional fornecida pelo tipo derivado de parâmetro não for necessária, o uso do tipo base permite maior uso do método. |
|
Construtores de tipos abstratos podem ser chamados apenas por tipos derivados.Porque os construtores públicos criar instâncias de um tipo e não é possível criar instâncias de um tipo abstrato, um tipo abstrato que tem um construtor público incorretamente foi projetado. |
|
CA1013: Igual do operador de sobrecarga em sobrecarga adicionar e subtrair |
Um tipo de público ou protegido implementa os operadores de adição ou subtração sem implementar o operador de igualdade. |
A especificação de CLS (Common Language) define as restrições de nomeação, tipos de dados e regras às quais assemblies devem obedecer se eles serão usados em linguagens de programação.Um bom design determina que todos os assemblies indicam explicitamente com CLS usando o CLSCompliantAttribute.Se esse atributo não estiver presente em um assembly, o assembly não é compatível com. |
|
A.NET Framework usa o número da versão para identificar exclusivamente um assembly e vincular a tipos em assemblies de nomeados forte.O número da versão é usado junto com a diretiva de versão e o publisher.Por padrão, os aplicativos são executados apenas com a versão do assembly com o qual elas foram criadas. |
|
ComVisibleAttribute determina como clientes COM acessam a código gerenciado.Um bom design dita que os assemblies indicam explicitamente a visibilidade de COM.Visibilidade de COM pode ser definida para o conjunto completo e, então, substituída para tipos individuais e membros de tipo.Se esse atributo não estiver presente, o conteúdo do assembly é visível para os clientes COM. |
|
Quando você define um atributo personalizado, marcá-lo usando AttributeUsageAttribute para indicar onde o código-fonte no atributo personalizado pode ser aplicado.O que significa e pretendido o uso de um atributo determinará seus locais válidos no código. |
|
Atributos podem definir argumentos obrigatórios que devem ser especificados quando você aplica o atributo para um destino.Eles também são conhecidos como argumentos posicionais porque eles são fornecidos para construtores de atributo como parâmetros de posição.Para cada argumento obrigatório, o atributo também deve fornecer uma propriedade somente leitura correspondente para que o valor do argumento pode ser recuperado em tempo de execução.Atributos também podem definir argumentos opcionais, que também são conhecidos como argumentos nomeados.Esses argumentos são fornecidos para construtores de atributo por nome e devem ter uma propriedade de leitura/gravação correspondente. |
|
Certifique-se de que cada um dos seus espaços para nomes possui uma organização lógica e que você tenha um motivo válido para colocar os tipos em um namespace de modo disperso preenchido. |
|
Passar tipos por referência (usando out ou ref) requer experiência com ponteiros, entender a diferença entre tipos de valor e tipos de referência e tratamento métodos com vários valores de retorno.Além disso, a diferença entre o check-out e parâmetros ref não é amplamente sabido. |
|
Os indexadores (isto é, propriedades indexadas) devem usar um único índice.Os indexadores multidimensionais podem reduzir significativamente a usabilidade da biblioteca. |
|
Um método público ou protegido tem um nome que começa com "Get", sem parâmetros e retorna um valor que não seja uma matriz.O método pode ser uma boa candidata a se tornar uma propriedade. |
|
Use uma matriz de parâmetros em vez de argumentos repetidos quando o número exato de argumentos é desconhecido e quando os argumentos de variáveis são os mesmos digite, ou podem ser passados como o mesmo tipo. |
|
Métodos que usam parâmetros padrão são permitidos em CLS; No entanto, o CLS permite compiladores ignoram os valores atribuídos a esses parâmetros.Para manter o comportamento que você deseja através de linguagens de programação, os métodos que usam parâmetros padrão devem ser substituídos por sobrecargas do método que fornecem os parâmetros padrão. |
|
Uma enumeração é um tipo de valor que define um conjunto de constantes nomeadas relacionados.Aplica FlagsAttribute em uma enumeração quando suas constantes nomeadas podem ser combinados de forma significativa. |
|
Uma enumeração é um tipo de valor que define um conjunto de constantes nomeadas relacionados.Por padrão, o tipo de dados de Int32 é usado para armazenar o valor da constante.Mesmo que você pode alterar esse tipo subjacente, não é necessária ou recomendada para a maioria dos cenários. |
|
Essa regra detecta os métodos que possuem nomes que normalmente seriam usados para eventos.Se um método for chamado em resposta a uma alteração de estado claramente definido, o método deve ser chamado por um manipulador de eventos.Objetos que chame o método devem disparar eventos em vez de chamar o método diretamente. |
|
Exceções gerais não devem ser pego.Capturar uma exceção mais específica ou relançar a exceção geral como a última declaração no bloco catch. |
|
Falha ao fornecer o conjunto completo de construtores pode tornar difícil tratar corretamente exceções. |
|
CA1033: Métodos de Interface devem ser podem ser chamados pelos tipos de filho |
Um tipo visível externamente sem lacre fornece uma implementação de método explícito de uma interface pública e não fornece um método alternativo de visível externamente que tem o mesmo nome. |
Um tipo aninhado é um tipo que é declarado no escopo de outro tipo.Tipos aninhados são úteis para encapsular os detalhes de implementação particular do tipo de recipiente.Usado para essa finalidade, tipos aninhados não devem ser visíveis externamente. |
|
CA1035: ICollection implementações com rigidez de tipos membros |
Esta regra exige implementações de ICollection para fornecer membros fortemente tipados para que os usuários não precisam converter argumentos para o tipo de objeto quando usarem a funcionalidade fornecida pela interface.Esta regra pressupõe que o tipo que implementa ICollection faz isso para gerenciar uma coleção de instâncias de um tipo que é mais forte que o objeto. |
Um tipo de público ou protegido implementa a interface IComparable.Ele não substitui Object. Equals nem ele oferece sobrecarregar o operador de idioma específico de igualdade, desigualdade, menor ou maior. |
|
Esta regra exige implementações de IEnumerator também fornecer uma versão com rigidez de tipos da propriedade atual para que os usuários não precisam converter o valor de retorno para o tipo de alta segurança quando usarem a funcionalidade fornecida pela interface. |
|
Esta regra exige implementações de IList para fornecer membros fortemente tipados para que os usuários não precisam converter argumentos para o tipo Object quando usarem a funcionalidade fornecida pela interface. |
|
Interfaces definir membros que fornecem um contrato de comportamento ou 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 todos os membros; Portanto, ele não define um contrato que pode ser implementado. |
|
Um tipo ou membro é marcado por usando um atributo ObsoleteAttribute que não tenha sua propriedade ObsoleteAttribute.Message especificada.Quando um tipo ou membro marcado usando ObsoleteAttribute é compilado, a propriedade do atributo de mensagem é exibida, que fornece as informações de usuário sobre o tipo obsoleto ou membro. |
|
CA1043: Usar o argumento integral ou seqüência de caracteres para os indexadores |
Os indexadores (isto é, propriedades indexadas) devem usar tipos integrais ou de seqüência de caracteres para o índice.Esses tipos são normalmente usados para estruturas de dados de indexação e elas aumentam a usabilidade da biblioteca.O uso do tipo de objeto deve ser restrito a esses casos onde o tipo específico da integrais ou de seqüência de caracteres não pode ser especificado em tempo de design. |
Embora seja aceitável e muitas vezes necessário ter uma propriedade somente leitura, as diretrizes de design proíbem o uso de propriedades somente para gravação.Isso ocorre porque permitindo que um usuário definir um valor e, em seguida, impedindo que o usuário exibir esse valor, não fornece nenhuma segurança.Além disso, sem acesso de leitura, o estado de objetos compartilhados não pode ser exibido, que limita sua utilidade. |
|
Passar tipos por referência (usando out ou ref) requer experiência com ponteiros, entender a diferença entre tipos de valor e tipos de referência e tratamento métodos com vários valores de retorno.Os arquitetos de biblioteca que projetar para o público em geral não devem esperar que os usuários trabalhando mestre com check-out ou parâmetros ref. |
|
CA1046: Não sobrecarregar o operador equals em tipos de referência |
A implementação padrão do operador de igualdade para tipos de referência, quase sempre está correta.Por padrão, a duas referências são iguais, apenas se eles apontam para o mesmo objeto. |
Tipos de declarar membros protegidos para que tipos de herança pode acessar ou substituir o membro.Por definição, selados tipos não podem ser herdados, que significa que não não possível chamar métodos protegidos em tipos lacrados. |
|
Tipos de declarar métodos como virtual para que tipos de herança pode substituir a implementação do método virtual.Por definição, um tipo selado não pode ser herdado.Isso torna um método virtual do tipo sealed sem sentido. |
|
CA1049: Os tipos que possuem recursos nativos devem ser descartáveis |
Tipos que alocam recursos não gerenciados devem implementar IDisposable para permitir que chamadores para liberar esses recursos sob demanda e para reduzir os tempos de vida dos objetos que contenham os recursos. |
Tipos são declarados em espaços para nome para evitar conflitos de nome e como uma forma de organizar os tipos relacionados em uma hierarquia de objetos. |
|
O principal uso de um campo deve ser como um detalhe de implementação.Os campos devem ser privadas ou internas e devem ser expostos por meio de propriedades. |
|
Um tipo de público ou protegido contém apenas membros estáticos e não foi declarado usando a (C#) selado ou modificador NotInheritable (Visual Basic).Um tipo que não pretende ser herdadas deve ser marcado usando o modificador sealed para impedir seu uso como um tipo base. |
|
CA1053: Tipos de portador estático não devem ter construtores |
Um tipo de público público ou aninhado declara apenas membros estáticos e possui um construtor padrão público ou protegido.O construtor é desnecessário porque chamar membros estáticos não requer uma instância do tipo.A sobrecarga de seqüência de caracteres deve chamar a sobrecarga URI (identificador) de recursos uniforme, usando o argumento de seqüência de caracteres para segurança e segurança. |
CA1054: Parâmetros da URI não devem ser seqüências de caracteres |
Se um método leva uma representação de seqüência de caracteres de um URI, uma sobrecarga correspondente deve ser fornecido que obtém uma instância da classe URI, que fornece esses serviços de maneira segura e protegida. |
CA1055: O URI retornar valores não devem ser seqüências de caracteres |
Esta regra pressupõe que o método retorna um URI.Uma representação de seqüência de caracteres de um URI está sujeita a análise e erros de codificação e pode levar a vulnerabilidades de segurança.A classe de System. URI fornece esses serviços de maneira segura e protegida. |
CA1056: Propriedades URI não devem ser seqüências de caracteres |
Esta regra pressupõe que a propriedade representa um URI.Uma representação de seqüência de caracteres de um URI está sujeita a análise e erros de codificação e pode levar a vulnerabilidades de segurança.A classe de System. URI fornece esses serviços de maneira segura e protegida. |
CA1057: String URI sobrecargas chamar System. URI sobrecargas |
Um tipo declara sobrecargas do método que diferem somente de substituição de um parâmetro de seqüência de caracteres com um parâmetro System. URI.A sobrecarga que aceita o parâmetro de seqüência de caracteres não chama a sobrecarga que aceita o parâmetro URI. |
Um tipo visível externamente estende a determinados tipos de base.Use uma das alternativas. |
|
CA1059: Os membros não devem expor certos tipos de concretos |
Um tipo concreto é um tipo que tem uma implementação completa e, portanto, pode ser instanciado.Para habilitar o uso difundido do membro, substitua o tipo concreto, usando a interface sugerida. |
Métodos de invocação de plataforma, tais como aqueles marcados com o System.Runtime.InteropServices.DllImportAttribute ou métodos definidos usando a palavra-chave de declarar em Visual Basic, acessar código não gerenciado.Esses métodos devem ser da classe NativeMethods, SafeNativeMethods ou UnsafeNativeMethods. |
|
Um método em um tipo base está oculta por um método com nomes idênticos em um tipo derivado, quando a assinatura de parâmetro do método derivado difere somente pelos tipos que são mais rigidez derivado do que os tipos correspondentes na assinatura do parâmetro do método base. |
|
Todos os argumentos de referência que são passados para métodos visíveis externamente devem ser verificados em relação a null. |
|
Todos os tipos de IDisposable devem implementar corretamente o padrão Dispose. |
|
Uma exceção interna é visível somente dentro de seu próprio escopo interno.Depois que a exceção cair fora do escopo interno, a base de exceção pode ser usado para capturar a exceção.Se a exceção interna é herdada do System.Exception, System.SystemException, ou System.ApplicationException, o código externo não terá informações suficientes para saber o que fazer com a exceção. |
|
Um método que não se espera lançar exceções lança uma exceção. |
|
O nome forte protege clientes de inadvertidamente carregar um assembly que foi violado.Os assemblies sem nomes de alta segurança não devem ser implantados fora cenários muito limitados.Se você compartilhar ou distribuir assemblies que não estão assinados corretamente, o assembly pode ser violado, o common language runtime não pode carregar o assembly ou o usuário pode ter que desativar a verificação no seu computador. |