Sdílet prostřednictvím


CA1800: Zbytečně přetypovat.

Název_typu

DoNotCastUnnecessarily

CheckId

CA1800

Kategorie

Microsoft.Performance

Změnit rozdělení

Bez rozdělení

Příčina

Metoda provádí duplicitní nádech jedním z jejích argumentů nebo lokální proměnné.Pro dokončení analýzy tímto pravidlem testované sestavení musí být vytvořeny pomocí ladicích informací a přidružený program soubor databáze (PDB) musí být k dispozici.

Popis pravidla

Duplicitní nádech snížení výkonu, zvláště, když v příkazech kompaktní iterace jsou prováděny nádech.Explicitní přetypování duplicitní operace uložit výsledek odevzdaných do místní proměnné a použít místní proměnné namísto duplicitní cast operací.

Pokud C# is operátor se používá při testování, zda budou úspěšné tavby, před provedením skutečné cast zvažte výsledek testování as operátor místo.To poskytuje stejné funkce bez implicitní přetypování operaci, která provádí is operátor.

Jak opravit porušení

Porušení tohoto pravidla opravit, změňte implementace metody minimalizovat počet operací cast.

Při potlačení upozornění

Je bezpečné potlačí upozornění od tohoto pravidla nebo Ignorovat pravidlo zcela, pokud výkon se netýká.

Příklad

Následující příklad ukazuje metodu, která porušují pravidlo pomocí C# is operátor.Druhá metoda splňuje pravidlo nahrazením is operátor proti výsledku testu as operátor, který snižuje počet operací cast každou iteraci od dvou do jednoho.

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

Následující příklad ukazuje způsob, start_Click, má více duplicitní explicitní nádech, který porušuje pravidla a metody, reset_Click, splňuje pravidlo uložením tavby místní proměnné.

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

Viz také

Referenční dokumentace

jako (referenční C#)

(C# odkaz)