避免进行不必要的初始化
更新: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;
}
}
}