Compartilhar via


CA1800: não converter desnecessariamente

TypeName

DoNotCastUnnecessarily

CheckId

CA1800

Categoria

Microsoft.Performance

Alteração Significativa

Sem quebra

Causa

Um método executa conversões duplicados em um de seus argumentos ou variáveis locais.Para a análise completa por esta regra, o assembly testado deve ser criado usando informações de depuração e o arquivo associado de base de dados do programa (.pdb) deve estar disponível.

Descrição da Regra

As conversões duplicados diminui o desempenho, principalmente quando as conversões são executadas em instruções compactas da iteração.Para operações de conversão explícitas duplicados, armazenar o resultado da conversão em uma variável local e usar variável local em vez das operações de conversão duplicados.

Se o operador C# is é usado para testar se a conversão for bem-sucedida antes que a conversão real seja executada, considere testar o resultado do operador de as em vez disso.Isso fornece a mesma funcionalidade sem a operação de conversão implícita é executada pelo operador de is .

Como Corrigir Violações

Para corrigir uma violação desta regra, modifique a implementação do método para minimizar o número de operações de conversão.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra, ou ignorar completamente a regra, se o desempenho não é um problema.

Exemplo

O exemplo a seguir mostra um método que viola a regra usando o operador C# is .Um segundo método obedece à regra substituindo o operador de is com um teste no resultado do operador de as , que diminui o número de operações de conversão pela iteração de dois a uma.

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, que tem conversões explícitas duplicados de múltiplas, que viola a regra, e um método, reset_Click, que satisfaça a regra para armazenar 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;
      }
   }
}

Consulte também

Referência

as (Referência de C#)

is (Referência de C#)