Freigeben über


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

Siehe auch

Referenz

Generika (C#-Programmierhandbuch)