Condividi tramite


CA1007: Utilizzare generics dove appropriato

TypeName

UseGenericsWhereAppropriate

CheckId

CA1007

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un metodo visibile esternamente contiene un parametro di riferimento di tipo System.Object e l'assembly che lo contiene è destinato a .NET Framework 2.0.

Descrizione della regola

Un parametro di riferimento è un parametro modificato mediante la parola chiave ref (ByRef in Visual Basic).Il tipo di argomento fornito per un parametro di riferimento deve corrispondere esattamente al tipo di parametro di riferimento.Per utilizzare un tipo derivato da un tipo di parametro di riferimento, è necessario innanzitutto eseguire il cast del tipo e assegnarlo a una variabile del tipo di parametro di riferimento.L'utilizzo di un metodo generico consente di passare al metodo tutti i tipi, soggetti a vincoli, senza prima eseguire il cast del tipo al tipo di parametro di riferimento.

Come correggere le violazioni

Per correggere una violazione di questa regola, rendere il metodo generico e sostituire il parametro Object con un parametro di tipo.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito è illustrata una routine di scambio di utilizzo generico implementata come metodo generico e non generico.Si noti con quale efficacia viene eseguito lo scambio delle stringhe mediante il metodo generico rispetto al metodo non generico.

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

Regole correlate

CA1005: Evitare un uso eccessivo di parametri nei tipi generici

CA1010: Le raccolte devono implementare un'interfaccia generica

CA1000: Non dichiarare membri statici su tipi generici

CA1002: Non esporre elenchi generici

CA1006: Non annidare tipi generici nelle firme dei membri

CA1004: I metodi generici devono fornire parametri di tipo

Ca1003: Utilizzare istanze di gestori eventi generici

Vedere anche

Riferimenti

Generics (Guida per programmatori C#)