CA1007: Use genéricos onde for apropriado
TypeName |
UseGenericsWhereAppropriate |
CheckId |
CA1007 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Quebrando |
Causa
Um método visível externamente contém um parâmetro de referência do tipo System.Objecte os destinos de assembly contendo .NET Framework 2.0.
Descrição da regra
Um parâmetro de referência é um parâmetro que é modificado usando o ref (ByRef na Visual Basic). de palavra-chave O tipo de argumento é fornecido para um parâmetro de referência deve corresponder exatamente o tipo de parâmetro de referência. Para usar um tipo que é derivado do tipo de parâmetro de referência, o tipo primeiro deve ser convertido e atribuído a uma variável do tipo de parâmetro de referência. Uso de um método genérico permite todos os tipos, sujeita às restrições, a serem passados para o método sem a projeção primeiro o tipo para o tipo de parâmetro de referência.
Como corrigir violações
Para corrigir uma violação desta regra, faça com que o método genérico e substituir o Object parâmetro usando um parâmetro de tipo.
Quando suprimir avisos
Não suprimir um aviso da regra.
Exemplo
O exemplo a seguir mostra uma rotina de troca de uso geral que é implementada como métodos não genérico e genéricos. Observe o quão eficientemente as seqüências são trocadas usando o método genérico em comparação comparado o método não 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);
}
}
}
Regras relacionadas
CA1005: Evitar o excesso parâmetros em tipos genéricos
CA1010: Coleções devem implementar a interface genérica
CA1000: Não é declarar membros estáticos em tipos genéricos
CA1002: Não expõem listas genéricas
CA1006: Não se aninham tipos genéricos em assinaturas de membro
CA1004: Métodos genéricos devem fornecer o parâmetro de tipo
CA1003: Usar instâncias do manipulador de evento genérico