Microsoft 基本正確性規則程式碼分析規則集
「Microsoft 基本正確性規則」規則集將焦點放在使用 Framework API 時的邏輯錯誤和常見的錯誤。 「基本正確性規則」包含「Microsoft 最小建議規則」規則集中的規則。 如需詳細資訊,請參閱 Microsoft 最小建議規則:程式碼分析規則集。您應包含此規則集,將最小建議規則所回報的警告清單加以擴大。
下表說明「Microsoft 基本正確性規則」規則集中的所有規則。
規則 |
說明 |
---|---|
如同其他實值型別一般,未初始化的列舉其預設值為零。 非旗標屬性的列舉型別應該要定義含有零值的成員,使列舉型別可以指定一個有效的預設值。 如果已套用 FlagsAttribute 屬性的列舉定義零值成員,則其名稱應該是 "None",以表示列舉中未設定任何值。 |
|
公用或保護的型別會實作加法或減法運算,但不會實作等號比較運算子。 |
|
外部可見的方法會將字串常值 (String Literal) 當做參數傳遞至 .NET Framework Class Library 中的建構函式 (Constructor) 或方法,且該字串應該可以當地語系化。 |
|
字串應該標準化為大寫字母。 有一小組的字元在轉換成小寫字母時無法達成來回行程。 |
|
已建立但從未使用的新物件;或呼叫會建立並傳回新字串的方法,而新字串從未使用過;或者 COM 或 P/Invoke 方法傳回從未使用的 HRESULT 或錯誤碼。 |
|
屬於 Dispose 實作的方法不會呼叫 GC.SuppressFinalize,或不屬於 Dispose 實作的方法會呼叫 GC.SuppressFinalize,或呼叫 GC.SuppressFinalize 並傳遞非 this (在 Visual Basic 中為 Me) 的方法。 |
|
即使屬性是唯讀,所傳回的陣列不會是寫入保護。 若要保持陣列為防止遭他人修改,屬性必須傳回陣列複本。 一般而言,使用者不了解呼叫這類屬性所造成的不良效能影響。 |
|
使用 String.Length 屬性或 String.IsNullOrEmpty 方法比較字串,明顯地會比使用 Equals 還快。 |
|
某一個成員或型別使用的是 Service Pack 中所含的成員或型別,但是專案的目標 Framework 中卻沒有包含該成員或型別。 |
|
如果轉換成 SafeHandle 用法,則會移除對 GC.KeepAlive (物件) 的所有呼叫。 在此情況下,類別不一定要呼叫 GC.KeepAlive,假設它們沒有完成項,但會根據 SafeHandle 最終處理其 OS 控制代碼。 |
|
在 Managed 程式碼中使用 IntPtr,可能會有潛在的安全性和可靠性問題。 必須檢閱所有使用 IntPtr 的情況,判斷是否需要在該處使用 SafeHandle (或類似技術)。 |
|
組件中不是以 RuntimeCompatibilityAttribute 標記或是以 RuntimeCompatibility(WrapNonExceptionThrows = false) 標記的成員包含處理 System.Exception 的 catch 區塊,同時不包含緊接其後的一般 catch 區塊。 |
|
外部可見型別包含了可變動參考型別的外部可見唯讀欄位。 可變動型別是可以修改執行個體 (Instance) 資料的型別。 |
|
當您將唯讀 (在 Visual Basic 中為 ReadOnly) 修飾詞套用至包含陣列的欄位時,欄位就不能變更為參考不同的陣列。 但是,儲存在唯讀欄位的陣列元素則可以變更。 |
|
方法會判斷提示使用權限,而且不會在呼叫端上執行安全性檢查。 判斷提示安全性權限但未執行任何安全性檢查,會在您的程式碼中留下可能遭利用的安全性弱點。 |
|
此規則所偵測的錯誤,可能是因為在 Unmanaged 程式碼仍在使用 Unmanaged 資源時,就完成 Unmanaged 資源所致。 |
|
可繼承的公用型別會提供內部 (在 Visual Basic 中為 Friend) 介面的可覆寫方法實作。 若要修正此規則的違規情形,請避免在組件外覆寫方法。 |
|
這個型別有接受 System.Runtime.Serialization.SerializationInfo 物件和 System.Runtime.Serialization.StreamingContext 物件 (序列化建構函式的簽章) 的建構函式。 這個建構函式未受到安全性檢查的保護,但型別中有一個或多個規則建構函式是受到保護的。 |
|
系統會在建立型別的第一個執行個體 (Instance) 或參考任何靜態成員之前呼叫靜態建構函式。 如果靜態建構函式不是私用的,則可由系統以外的程式碼呼叫。 視建構函式中執行的作業而定,這會造成非預期的行為。 |
|
已定義平台叫用方法,而且 .NET Framework Class Library 中有具同等功能的方法存在。 |
|
如果型別會繼承自可處置的型別,則必須從本身的 Dispose 方法呼叫基底型別的 Dispose 方法。 |
|
完成項必須使用系列存取修飾詞 (Modifier)。 |
|
您不得變更繼承成員的存取修飾詞 (Modifier)。 將繼承成員變更為私用不會防止呼叫端存取方法的基底類別 (Base Class) 實作。 |
|
雖然 Common Language Runtime 允許使用傳回型別區分其他部分都相同的成員,但這個功能不屬於 Common Language Specification,也不是 .NET 程式語言共通的功能。 |
|
public 型別會實作等號比較運算子,但不會覆寫 Object.Equals。 |
|
型別實作等號比較運算子或不等比較運算子,但未實作相反的運算子。 |
|
可寫入的集合屬性允許使用者以不同的集合來取代該集合。 唯讀屬性會從取代過程中停止集合,但是仍然允許設定個別成員。 |
|
實值型別會覆寫 Object.Equals,但不會實作等號比較運算子。 |
|
型別具有以 System.Runtime.Serialization.OptionalFieldAttribute 屬性標示的欄位,而且型別不提供還原序列化事件處理方法。 |