Partilhar via


CA1007: Usar genéricos quando apropriado

Item Valor
RuleId CA1007
Categoria Microsoft.Design
Alteração da falha Quebra

Causa

Um método visível externamente contém um parâmetro de referência do tipo System.Object, e assembly recipiente é direcionado ao .NET Framework 2.0.

Descrição da regra

Um parâmetro de referência é um parâmetro que é modificado usando a palavra-chave ref (ByRef no Visual Basic). O tipo de argumento fornecido para um parâmetro de referência precisa corresponder exatamente ao tipo de parâmetro de referência. Para usar um tipo derivado do tipo de parâmetro de referência, o tipo precisa primeiro ser convertido e atribuído a uma variável do tipo de parâmetro de referência. O uso de um método genérico permite que todos os tipos, sujeitos a restrições, sejam passados para o método sem primeiramente converter o tipo no tipo de parâmetro de referência.

Como corrigir violações

Para corrigir uma violação dessa regra, torne o método genérico e substitua o parâmetro Object usando um parâmetro de tipo.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

O exemplo a seguir mostra uma rotina de troca de uso geral que é implementada como métodos genéricos e não genéricos. Observe a eficiência com que as cadeias de caracteres são trocadas usando o método genérico em comparação com o método não genérico.

using System;

namespace DesignLibrary
{
   public sealed class ReferenceParameters
   {
      private ReferenceParameters(){}

      // This method violates the rule.
      public static void Swap(ref object object1, ref object object2)
      {
         object temp = object1;
         object1 = object2;
         object2 = temp;
      }

      // This method satifies the rule.
      public static void GenericSwap<T>(ref T reference1, ref T reference2)
      {
         T temp = reference1;
         reference1 = reference2;
         reference2 = temp;
      }
   }

   class Test
   {
      static void Main()
      {
         string string1 = "Swap";
         string string2 = "It";

         object object1 = (object)string1;
         object object2 = (object)string2;
         ReferenceParameters.Swap(ref object1, ref object2);
         string1 = (string)object1;
         string2 = (string)object2;
         Console.WriteLine("{0} {1}", string1, string2);

         ReferenceParameters.GenericSwap(ref string1, ref string2);
         Console.WriteLine("{0} {1}", string1, string2);
      }
   }
}

CA1005: Evitar parâmetros excessivos em tipos genéricos

CA1010: Coleções devem implementar uma interface genérica

CA1000: Não declarar membros estáticos em tipos genéricos

CA1002: Não expor listas genéricas

CA1006: Não aninhar tipos genéricos em assinaturas de membro

CA1004: Métodos genéricos devem fornecer um parâmetro de tipo

CA1003: Usar instâncias do manipulador de eventos genérico

Confira também

Genéricos