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