更新:2007 年 11 月
| TypeName | DoNotInitializeUnnecessarily | 
| CheckId | CA1805 | 
| 类别 | Microsoft.Performance | 
| 是否重大更改 | 否 | 
原因
静态或实例构造函数将字段初始化为其默认值。该规则忽略托管 C++ 程序集。
规则说明
运行构造函数之前,公共语言运行库将所有字段初始化为其默认值。在大多数情况下,在构造函数中将字段初始化为其默认值是多余的,此行为会降低性能并增加维护成本。但是,在以下情况下将字段初始化为其默认值的过程并非是多余的:构造函数调用同一个类的另一个构造函数,或调用基类构造函数,而被调用的构造函数将字段初始化为非默认值。在这种情况下,将字段值更改回其默认值是正确的。
如何修复冲突
要修复与该规则的冲突,请从构造函数中移除字段的初始化过程。注意,在启用了 optimize 选项的情况下,随 .NET Framework 2.0 提供的 C# 编译器将移除这些不必要的初始化。
还可以按如下所示将字段初始化转换为断言:
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;
      }
   }
}