更新 : 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;
}
}
}