請勿執行不必要的初始化
更新:2007 年 11 月
型別名稱 |
DoNotInitializeUnnecessarily |
CheckId |
CA1805 |
分類 |
Microsoft.Performance |
中斷變更 |
非中斷 |
原因
靜態或執行個體建構函式會將欄位初始化為它的預設值。此規則會忽略 Managed C++ 組件。
規則描述
Common Language Runtime 會在執行建構函式之前,將所有欄位初始化為它的預設值。在大多數情況下,在建構函式中將欄位初始化為預設值是多餘的,而且會降低效能並提高維護成本。有一種情況不會發生多餘情形,就是當建構函式呼叫其他相同類別的建構函式或基底類別 (Base Class) 建構函式,而且被呼叫的建構函式會將欄位初始化為非預設值時。在這種情況下,就適合將欄位值變回它的預設值。
如何修正違規
若要修正此規則的違規情形,請從建構函式中移除欄位初始設定。請注意,.NET Framework 2.0 所包含的 C# 編譯器會在啟用 optimize 選項時,移除這些不必要的初始設定。
您也可以將欄位初始設定轉換為判斷提示 (Assert),如下所示:
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;
}
}
}