避免进行不必要的初始化

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

请参见

其他资源

默认值表(C# 参考)