CA1800: 不必要にキャストしません

Item [値]
規則 ID CA1800
カテゴリ Microsoft.Performance
互換性に影響する変更点 なし

原因

メソッドは、引数またはローカル変数の 1 つに対して重複するキャストを実行します。

この規則による完全な解析を得るには、テストされるアセンブリをデバッグ情報を使用してビルドし、関連付けられているプログラムのデータベース (.pdb) ファイルが使用できる必要があります。

Note

このルールは非推奨とされました。 詳細については、「非推奨の規則」を参照してください。

規則の説明

二重のキャストがあるとパフォーマンスが低下します。特に、小さな繰り返しステートメントでキャストが実行される場合はそうです。 明示的な重複キャスト操作の場合、キャストの結果をローカル変数に格納し、重複キャスト操作の代わりにローカル変数を使用します。

C# is 演算子を使用して、実際のキャストが実行される前にキャストが成功するかどうかをテストする場合は、代わりに as 演算子の結果をテストすることを検討してください。 これにより、is 演算子によって実行される暗黙的なキャスト操作なしで同じ機能が提供されます。 または、C# 7.0 以降では、is 演算子とパターン マッチングを使用して型変換を確認し、式をその型の変数に 1 つのステップでキャストします。

違反の修正方法

この規則違反を修正するには、メソッドの実装を変更して、キャスト操作の数を最小限にします。

どのようなときに警告を抑制するか

パフォーマンスが問題にならない場合は、この規則による警告を抑制したり、規則を完全に無視したりしても問題ありません。

次の例は、C# is 演算子を使用して規則に違反するメソッドを示しています。 2 番目のメソッドは、is 演算子を as 演算子の結果に対するテストに置き換えることで規則を満たします。これにより、反復ごとのキャスト操作の数が 2 から 1 に減少します。 3 番目のメソッドも、型変換が成功した場合に isパターン マッチングを使用して目的の型の変数を作成することにより、規則を満たします。

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

次の例は、規則に違反する複数の重複した明示的なキャストを持つメソッド start_Click と、キャストをローカル変数に格納することで規則を満たすメソッド reset_Click を示しています。

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

関連項目