CA1007: Nach Möglichkeit Generika verwenden
TypeName |
UseGenericsWhereAppropriate |
CheckId |
CA1007 |
Kategorie |
Microsoft.Design |
Unterbrechende Änderung |
Breaking |
Ursache
Eine extern sichtbare Methode enthält einen Verweisparameter des Typs System.Object, und die enthaltende Assembly hat .NET Framework 2.0 zum Ziel.
Regelbeschreibung
Ein Verweisparameter ist ein Parameter, der mit dem ref (ByRef in Visual Basic)-Schlüsselwort geändert wird. Der für einen Verweisparameter angegebene Argumenttyp muss genau mit dem Typ des Verweisparameters übereinstimmen. Damit ein vom Typ des Verweisparameters abgeleiteter Typ verwendet werden kann, muss der Typ zuerst umgewandelt und dann einer Variablen des Verweisparametertyps zugewiesen werden. Bei Verwendung einer generischen Methode können alle Typen mit gewissen Einschränkungen an die Methode übergeben werden, ohne dass der Typ zuvor in den Typ des Verweisparameters umgewandelt werden muss.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, verwenden Sie eine generische Methode und ersetzen den Object-Parameter durch einen Typparameter.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
Im folgenden Beispiel wird eine allgemein verwendbare Austauschroutine veranschaulicht, die sowohl mit nicht generischen als auch mit generischen Methoden implementiert ist. Beachten Sie, wie effizient die Zeichenfolgen mit der generischen Methode im Vergleich zur nicht generischen Methode ausgetauscht werden.
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);
}
}
}
Verwandte Regeln
CA1005: Übermäßige Anzahl von Parametern in generischen Typen vermeiden
CA1010: Auflistungen müssen eine generische Schnittstelle implementieren
CA1000: Statische Member nicht in generischen Typen deklarieren
CA1002: Generische Listen nicht verfügbar machen
CA1006: Generische Typen in Membersignaturen nicht schachteln
CA1004: Generische Methoden müssen den Typparameter angeben
CA1003: Generische Ereignishandlerinstanzen verwenden