Udostępnij za pośrednictwem


CA1800: Nie przeprowadzaj niepotrzebnych operacji rzutowania

TypeName

DoNotCastUnnecessarily

CheckId

CA1800

Kategoria

Microsoft.Performance

Zmiana kluczowa

Niekluczowa

Przyczyna

Metoda wykonuje zduplikowane rzutowanie na jednym ze swoich argumentów lub zmiennych lokalnych.Do kompletnej analizy przez tę regułę badany zestaw musi być zbudowany przy użyciu informacji debugowania i skojarzony plik bazy danych programu (.pdb) musi być dostępny.

Opis reguły

Zduplikowane rzutowania zmniejszyć wydajność, zwłaszcza gdy rzutowania wykonywane są w niedużej iteracji.Dla zduplikowanych jawnych operacji rzutowania, należy przechować wynik rzutowania w zmiennej lokalnej i używać zmiennej lokalnej zamiast zduplikowanych operacji rzutowania.

Jeśli operator C# is używany jest aby sprawdzić, czy rzutowanie powiedzie się przed wykonaniem samego rzutowania, należy rozważyć użycie w zamian operatora as.Zapewnia to taką samą funkcjonalność bez niejawnej operacji rzutowania, która jest wykonywana przez operator is.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zmodyfikować implementację metody aby zminimalizować liczbę operacji rzutowania.

Kiedy pominąć ostrzeżenia

Bezpiecznie jest pominąć ostrzeżenia dotyczące tej reguły lub zignorować ją całkowicie, jeśli wydajność nie jest istotna.

Przykład

Poniższy przykład przedstawia metodę, która narusza tą regułę przy użyciu operatora C# is.Druga metoda spełnia tą regułę, zastępując operator is testem wyniku działania operatora as, co zmniejsza liczbę operacji rzutowania na iterację z dwóch do jednej.

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

Poniższy przykład przedstawia metodę start_Click, która ma wiele zduplikowanych jawnych rzutowań, co narusza tą regułę a metoda reset_Click, spełnia regułę poprzez przechowywanie rzutowania w zmiennej lokalnej.

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

Zobacz też

Informacje

as (odwołanie w C#)

is (odwołanie w C#)