CA1007: Utilizzare generics dove appropriato
TypeName |
UseGenericsWhereAppropriate |
CheckId |
CA1007 |
Category |
Microsoft.Design |
Breaking Change |
Breaking |
Causa
Un metodo visibile esternamente contiene un parametro di riferimento di tipo System.Object e l'assembly che lo contiene è destinato a .NET Framework 2.0.
Descrizione della regola
Un parametro di riferimento è un parametro modificato mediante la parola chiave ref (ByRef in Visual Basic).Il tipo di argomento fornito per un parametro di riferimento deve corrispondere esattamente al tipo di parametro di riferimento.Per utilizzare un tipo derivato da un tipo di parametro di riferimento, è necessario innanzitutto eseguire il cast del tipo e assegnarlo a una variabile del tipo di parametro di riferimento.L'utilizzo di un metodo generico consente di passare al metodo tutti i tipi, soggetti a vincoli, senza prima eseguire il cast del tipo al tipo di parametro di riferimento.
Come correggere le violazioni
Per correggere una violazione di questa regola, rendere il metodo generico e sostituire il parametro Object con un parametro di tipo.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio
Nell'esempio riportato di seguito è illustrata una routine di scambio di utilizzo generico implementata come metodo generico e non generico.Si noti con quale efficacia viene eseguito lo scambio delle stringhe mediante il metodo generico rispetto al metodo non generico.
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);
}
}
}
Regole correlate
CA1005: Evitare un uso eccessivo di parametri nei tipi generici
CA1010: Le raccolte devono implementare un'interfaccia generica
CA1000: Non dichiarare membri statici su tipi generici
CA1002: Non esporre elenchi generici
CA1006: Non annidare tipi generici nelle firme dei membri
CA1004: I metodi generici devono fornire parametri di tipo
Ca1003: Utilizzare istanze di gestori eventi generici