Partilhar via


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;
      }
   }
}

Consulte também

Referência

como (Referência C#)

é (Referência C#)