Compartir a través de


CA1007: Utilizar valores genéricos cuando sea posible

Nombre de tipo

UseGenericsWhereAppropriate

Identificador de comprobación

CA1007

Categoría

Microsoft.Design

Cambio problemático

Causa

Un método visible externamente contiene un parámetro de referencia de tipo System.Object y el ensamblado que lo contiene está dirigido a .NET Framework 2.0.

Descripción de la regla

Un parámetro de referencia es un parámetro que se modifica utilizando la palabra clave ref (ByRef en Visual Basic). El tipo del argumento proporcionado para un parámetro de referencia debe coincidir exactamente con el tipo del parámetro de referencia. Para utilizar un tipo que se deriva del tipo del parámetro de referencia, es preciso convertir dicho tipo en primer lugar y asignárselo a una variable del tipo del parámetro de referencia. El uso de un método genérico permite pasar al método todos los tipos, sujeto a las restricciones que puedan ser de aplicación, sin convertirlos antes al tipo del parámetro de referencia.

Cómo corregir infracciones

Para corregir una infracción de esta regla, haga que todos los métodos sean genéricos y reemplace el parámetro Object utilizando un parámetro type.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El ejemplo siguiente muestra una rutina de intercambio de uso general implementada como método no genérico y genérico. Observe la eficacia con que se intercambian las cadenas utilizando el método genérico, en comparación con el método no genérico.

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

Reglas relacionadas

CA1005: Evite parámetros excesivos en tipos genéricos

CA1010: Las colecciones deben implementar la interfaz genérica

CA1000: No declarar miembros estáticos en tipos genéricos

CA1002: No exponer listas genéricas

CA1006: No anidar tipos genéricos en firmas de miembro

CA1004: Los métodos genéricos deben proporcionar un parámetro de tipo

CA1003: Utilizar instancias genéricas de controlador de eventos

Vea también

Referencia

Genéricos (Guía de programación de C#)