Partager via


CA1007 : Utiliser des classes génériques lorsque cela est approprié

TypeName

UseGenericsWhereAppropriate

CheckId

CA1007

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

Une méthode visible de l'extérieur contient un paramètre de référence de type System.Object, et l'assembly conteneur vise le .NET Framework 2.0.

Description de la règle

Un paramètre de référence est un paramètre qui est modifié à l'aide du mot clé ref (ByRef en Visual Basic). Le type d'argument fourni pour un paramètre de référence doit correspondre exactement au type de paramètre de référence. Pour utiliser un type dérivé du type de paramètre de référence, vous devez d'abord effectuer un cast du type et l'assigner à une variable du type de paramètre de référence. L'utilisation d'une méthode générique autorise le passage de tous les types, soumis à des contraintes, dans la méthode sans cast préalable du type vers le type de paramètre de référence.

Comment corriger les violations

Pour corriger une violation de cette règle, rendez la méthode générique et remplacez le paramètre Object par un paramètre de type.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant présente une routine de permutation à usage général implémentée comme des méthodes génériques et non génériques. Notez l'efficacité de la permutation des chaînes à l'aide de la méthode générique par rapport à la méthode non générique.

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

Règles connexes

CA1005 : Éviter les paramètres excessifs sur les types génériques

CA1010 : Les collections doivent implémenter une interface générique

CA1000 : Ne pas déclarer de membres statiques sur les types génériques

CA1002 : Ne pas exposer de listes génériques

CA1006 : Ne pas imbriquer les types génériques dans les signatures de membre

CA1004 : Les méthodes génériques doivent fournir un paramètre de type

CA1003 : Utiliser les instances du gestionnaire d'événements génériques

Voir aussi

Référence

Génériques (guide de programmation C#)