Partilhar via


CA1800: Não convertem desnecessariamente

TypeName

DoNotCastUnnecessarily

CheckId

CA1800

<strong>Categoria</strong>

Microsoft.Performance

Alteração significativa

Não-separável

Causa

Um método executa conversões duplicados em um dos seus argumentos ou variáveis locais.Para concluir a análise por esta regra, o assembly testado deve ser construído usando as 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 de duplicados diminuir o desempenho, especialmente quando as projeções são realizadas em instruções de iteração compact.Para operações de conversão explícita de duplicados, armazenar o resultado do tom em uma variável local e use a variável local em vez das operações cast duplicados.

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

Como corrigir violações

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

Quando suprimir avisos

É seguro para eliminar um aviso esta regra, ou ignorar a regra completamente, se o desempenho não for uma preocupação.

Exemplo

O exemplo a seguir mostra um método que viola a regra usando o C# is operador.Um segundo método satisfaz a regra, substituindo o is operador com um teste contra o resultado do as operador, o que diminui o número de operações de conversão 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, que tem várias conversões explícitas duplicados, que viola a regra e um método, reset_Click, que satisfaz a regra, armazenando a projeçã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

como (referência de C#)

é (referência de C#)