Não converter desnecessariamente
TypeName |
DoNotCastUnnecessarily |
CheckId |
CA1800 |
Category (Categoria) |
Microsoft.desempenho |
Quebrando alterar |
Não separável |
Causa
Um método realiza conversões duplicados em um de seus argumentos ou variáveis locais.Concluir análise por esta regra, testado o assembly deve ser construído com informações de depuração e o arquivo de banco de dados (.pdb) do programa associado deve estar disponível.
Descrição da regra
Projeções duplicadas degradar o desempenho, especialmente quando as projeções são realizadas em instruções de iteração compacto.Para operações explícitas elenco duplicados, armazenar o resultado da conversão em uma variável local e usar a variável local em vez das operações de conversão duplicados.
Se o translation from VPE for Csharp is operador é usado para testar se a conversão será bem-sucedida antes que a conversão real é realizada, considere a possibilidade de testar o resultado do as operador em vez disso. Isso fornece a mesma funcionalidade sem a operação de conversão implícita executada pelo is operador.
Como corrigir violações
Para corrigir uma violação dessa regra, modifique a implementação do método para minimizar o número de operações de conversão.
Quando suprimir avisos
É seguro eliminar um aviso da regra ou ignorar a regra inteiramente, se o desempenho não for uma preocupação.
Exemplo
O exemplo a seguir mostra um método que viola a regra usando o translation from VPE for Csharp is operador. Um segundo método satisfaz a regra, substituindo o is operador com um teste contra o resultado do as converter os operador, o que diminui o número de operações por iteração de dois para um.
using System;
using System.Collections;
using System.Windows.Forms;
namespace PerformanceLibrary
{
public sealed class SomeClass
{
private SomeClass() {}
// This method violates the rule.
public static void UnderPerforming(ArrayList list)
{
foreach(object obj in list)
{
// The 'is' statement performs a cast operation.
if(obj is Control)
{
// The 'as' statement performs a duplicate cast operation.
Control aControl = obj as Control;
// Use aControl.
}
}
}
// This method satisfies the rule.
public static void BetterPerforming(ArrayList list)
{
foreach(object obj in list)
{
Control aControl = obj as Control;
if(aControl != null)
{
// Use aControl.
}
}
}
}
}
O exemplo a seguir mostra um método, start_Click, com vários duplicados conversões explícitas, que viola a regra e um método, reset_Click, que satisfaz a regra, armazenando a conversão em uma variável local.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Namespace PerformanceLibrary
Public Class SomeForm : Inherits Form
Dim start, reset As Button
Sub New()
start = New Button()
reset = New Button()
AddHandler start.Click, AddressOf start_Click
AddHandler reset.Click, AddressOf reset_Click
Controls.Add(start)
Controls.Add(reset)
End Sub
' This method violates the rule.
Private Sub start_Click(sender As Object, e As EventArgs)
Dim controlSize As Size = DirectCast(sender, Control).Size
Dim rightToLeftValue As RightToLeft = _
DirectCast(sender, Control).RightToLeft
Dim parent As Control = DirectCast(sender, Control)
End Sub
' This method satisfies the rule.
Private Sub reset_Click(sender As Object, e As EventArgs)
Dim someControl As Control = DirectCast(sender, Control)
Dim controlSize As Size = someControl.Size
Dim rightToLeftValue As RightToLeft = someControl.RightToLeft
Dim parent As Control = someControl
End Sub
End Class
End Namespace
using System;
using System.Drawing;
using System.Windows.Forms;
namespace PerformanceLibrary
{
public class SomeForm : Form
{
Button start, reset;
public SomeForm()
{
start = new Button();
reset = new Button();
start.Click += new EventHandler(start_Click);
reset.Click += new EventHandler(reset_Click);
Controls.Add(start);
Controls.Add(reset);
}
// This method violates the rule.
void start_Click(object sender, EventArgs e)
{
Size controlSize = ((Control)sender).Size;
RightToLeft rightToLeftValue = ((Control)sender).RightToLeft;
Control parent = (Control)sender;
}
// This method satisfies the rule.
void reset_Click(object sender, EventArgs e)
{
Control someControl = (Control)sender;
Size controlSize = someControl.Size;
RightToLeft rightToLeftValue = someControl.RightToLeft;
Control parent = someControl;
}
}
}