CA1007 : Utiliser des classes génériques lorsque cela est appropriéCA1007: Use generics where appropriate

TypeNameTypeName UseGenericsWhereAppropriateUseGenericsWhereAppropriate
CheckIdCheckId CA1007CA1007
CategoryCategory Microsoft.DesignMicrosoft.Design
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Une méthode extérieurement visible contient un paramètre de référence de type System.Objectet l’assembly conteneur cible .NET Framework 2.0.NET Framework 2.0.An externally visible method contains a reference parameter of type System.Object, and the containing assembly targets .NET Framework 2.0.NET Framework 2.0.

Description de la règleRule description

Un paramètre de référence est un paramètre qui est modifié à l’aide de la ref (ByRef dans Visual BasicVisual Basic) mot clé.A reference parameter is a parameter that is modified by using the ref (ByRef in Visual BasicVisual Basic) keyword. 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.The argument type that is supplied for a reference parameter must exactly match the reference parameter type. Pour utiliser un type qui est dérivé du type de paramètre de référence, le type doit tout d’abord être converti et assigné à une variable du type de paramètre de référence.To use a type that is derived from the reference parameter type, the type must first be cast and assigned to a variable of the reference parameter type. Utilisation d’une méthode générique autorise tous les types, soumis aux contraintes, doivent être passés à la méthode sans cast préalable du type pour le type de paramètre de référence.Use of a generic method allows all types, subject to constraints, to be passed to the method without first casting the type to the reference parameter type.

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, rendez la méthode générique et remplacez le Object paramètre à l’aide d’un paramètre de type.To fix a violation of this rule, make the method generic and replace the Object parameter by using a type parameter.

Quand supprimer les avertissementsWhen to suppress warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule.

ExempleExample

L’exemple suivant montre une routine de permutation à usage général qui est implémentée en tant que méthodes génériques et non.The following example shows a general-purpose swap routine that is implemented as both nongeneric and generic methods. Notez comment efficacement les chaînes sont permutées à l’aide de la méthode générique par rapport à la méthode non générique.Note how efficiently the strings are swapped by using the generic method compared to the nongeneric method.

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

CA1005 : Évitez trop de paramètres sur les types génériquesCA1005: Avoid excessive parameters on generic types

CA1010 : Les collections doivent implémenter une interface génériqueCA1010: Collections should implement generic interface

CA1000 : Ne déclarez pas de membres statiques sur les types génériquesCA1000: Do not declare static members on generic types

CA1002 : N’exposez pas de listes génériquesCA1002: Do not expose generic lists

CA1006 : Ne pas imbriquer les types génériques dans les signatures de membreCA1006: Do not nest generic types in member signatures

CA1004 : Les méthodes génériques doivent fournir un paramètre de typeCA1004: Generic methods should provide type parameter

CA1003 : Utiliser les instances du gestionnaire d’événements génériquesCA1003: Use generic event handler instances

Voir aussiSee also

GénériquesGenerics