Partilhar via


CA1007: usar genéricos quando apropriado

TypeName

UseGenericsWhereAppropriate

CheckId

CA1007

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

Um método externamente visível contém um parâmetro de referência do tipo Object, e o assembly que contém .NET Framework 2,0de destino.

Descrição da Regra

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

Como Corrigir Violações

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

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra uma rotina de uso geral de troca que é implementada como métodos e não genéricas.Observe que as cadeias de caracteres são trocadas com eficácia usando o método genérico comparado ao método não.

Imports System

Namespace DesignLibrary

   Public NotInheritable Class ReferenceParameters

      Private Sub New()
      End Sub 

      ' This method violates the rule. 
      Public Shared Sub Swap( _  
         ByRef object1 As Object, ByRef object2 As Object)

         Dim temp As Object = object1
         object1 = object2
         object2 = temp

      End Sub 

      ' This method satifies the rule. 
      Public Shared Sub GenericSwap(Of T)( _ 
         ByRef reference1 As T, ByRef reference2 As T)

         Dim temp As T = reference1
         reference1 = reference2
         reference2 = temp

      End Sub 

   End Class 

   Class Test

      Shared Sub Main()

         Dim string1 As String = "Swap" 
         Dim string2 As String = "It" 

         Dim object1 As Object = DirectCast(string1, Object)
         Dim object2 As Object = DirectCast(string2, Object)
         ReferenceParameters.Swap(object1, object2)
         string1 = DirectCast(object1, String)
         string2 = DirectCast(object2, String)
         Console.WriteLine("{0} {1}", string1, string2)

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

      End Sub 

   End Class 

End Namespace
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);
      }
   }
}

Regras Relacionadas

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

CA1010: as coleções devem implementar a 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: os métodos genéricos devem fornecer o parâmetro de tipo

CA1003: usar instâncias do manipulador de eventos genéricos

Consulte também

Referência

Genéricos (Guia de Programação em C#)