次の方法で共有


不要な初期化です

更新 : 2007 年 11 月

TypeName

DoNotInitializeUnnecessarily

CheckId

CA1805

カテゴリ

Microsoft.Performance

互換性に影響する変更点

なし

原因

静的コンストラクタまたはインスタンス コンストラクタがフィールドを既定値に初期化しています。この規則でマネージ C++ アセンブリは無視されます。

規則の説明

共通言語ランタイムは、コンストラクタを実行する前にすべてのフィールドを既定値に初期化します。ほとんどの場合、コンストラクタでフィールドを既定値に初期化する処理は冗長です。これによってパフォーマンスが低下し、保守コストが増加します。冗長にならない例を 1 つ挙げると、コンストラクタが、同じクラスの別コンストラクタまたは基本クラスのコンストラクタを呼び出し、そのコンストラクタがフィールドを既定値以外の値に初期化する場合があります。この場合、フィールドの値を変更して既定値に戻すのが適切なこともあります。

違反の修正方法

この規則違反を修正するには、コンストラクタからフィールドの初期化を削除します。.NET Framework 2.0 に同梱される C# コンパイラは、optimize オプションが有効である場合、このように不要な初期化を削除します。

次に示すように、フィールドの初期化をアサートに変換することもできます。

Debug.Assert(field == 0); 

これは規則に準拠しており、しかもこのコードを扱うプログラマにはフィールドが初期化済みであることが明確になります。これによって、複数の言語で作業することに慣れているプログラマに対し、より馴染み深いモデルを提示できます。

警告を抑制する状況

コンストラクタが、同じクラスの別のコンストラクタまたは基本クラスのコンストラクタを呼び出し、そのコンストラクタがフィールドを既定値以外の値に初期化する場合は、この規則による警告を抑制します。また、パフォーマンスとコードの保守が重要ではない場合は、この規則による警告を抑制するか、この規則自体を無効にしても安全です。

使用例

この規則違反が複数含まれる型を次の例に示します。

Imports System

Namespace PerformanceLibrary

   Class InitializeUnnecessarily

      Dim b1 As Boolean
      Dim b2 As Boolean
      Dim i As Integer
      Dim d As Double
      Dim s As String

      Sub New()

         b1 = True

         ' The following field assignments are violations of this rule.
         b2 = False
         i = 0
         d = 0
         s = Nothing

      End Sub

      Sub New(s As String)

         Me.New()

         ' Exclude the warning for the following statement.
         b1 = False

         Me.s = s

      End Sub

   End Class

End Namespace
using System;

namespace PerformanceLibrary
{
   class InitializeUnnecessarily
   {
      bool b1;
      bool b2;
      int i;
      double d;
      string s;

      InitializeUnnecessarily()
      {
         b1 = true;

         // The following field assignments are violations of this rule.
         b2 = false;
         i = 0;
         d = 0;
         s = null;
      }

      InitializeUnnecessarily(string s) : this()
      {
         // Exclude the warning for the following statement.
         b1 = false;

         this.s = s;
      }
   }
}

参照

その他の技術情報

既定値の一覧表 (C# リファレンス)