Compartilhar via


CA1007: Use genéricos onde for apropriado

TypeName

UseGenericsWhereAppropriate

CheckId

CA1007

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Quebrando

Causa

Um método visível externamente contém um parâmetro de referência do tipo System.Objecte os destinos de assembly contendo .NET Framework 2.0.

Descrição da regra

Um parâmetro de referência é um parâmetro que é modificado usando o ref (ByRef na Visual Basic) palavra-chave.O tipo de argumento que é fornecido para um parâmetro de referência deve corresponder exatamente o tipo de parâmetro de referência.Para usar um tipo que é derivado do tipo de parâmetro de referência, o tipo primeiro deve ser convertido e atribuído a uma variável do tipo de parâmetro de referência.Uso de um método genérico permite 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.

Como corrigir violações

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

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

O exemplo a seguir mostra uma rotina de troca de uso geral que é implementada como métodos não genérico e genéricos.Observe o quão eficientemente as seqüências de caracteres são trocadas usando o método genérico em comparação comparado o método não genérico.

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 excessivos parâmetros em tipos genéricos

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

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

CA1002: Não expõem listas genéricas

CA1006: Não se aninham tipos genéricos em assinaturas de membros

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

CA1003: Usar instâncias de manipulador de evento genérico

Consulte também

Referência

Genéricos (guia de programação do C#)