共用方式為


Microsoft 基本正確性規則程式碼分析規則集

「Microsoft 基本正確性規則」規則集將焦點放在使用 Framework API 時的邏輯錯誤和常見的錯誤。 「基本正確性規則」包含「Microsoft 最小建議規則」規則集中的規則。 如需詳細資訊,請參閱 Microsoft 最小建議規則:程式碼分析規則集。您應包含此規則集,將最小建議規則所回報的警告清單加以擴大。

下表說明「Microsoft 基本正確性規則」規則集中的所有規則。

規則

說明

CA1008:列舉值中應該要有值為零的成員

如同其他實值型別一般,未初始化的列舉其預設值為零。 非旗標屬性的列舉型別應該要定義含有零值的成員,使列舉型別可以指定一個有效的預設值。 如果已套用 FlagsAttribute 屬性的列舉定義零值成員,則其名稱應該是 "None",以表示列舉中未設定任何值。

CA1013:多載加號和減號運算子時必須一併多載等號比較運算子

公用或保護的型別會實作加法或減法運算,但不會實作等號比較運算子。

CA1303:不要將常值當做已當地語系化的參數傳遞

外部可見的方法會將字串常值 (String Literal) 當做參數傳遞至 .NET Framework Class Library 中的建構函式 (Constructor) 或方法,且該字串應該可以當地語系化。

CA1308:必須將字串標準化為大寫字母

字串應該標準化為大寫字母。 有一小組的字元在轉換成小寫字母時無法達成來回行程。

CA1806:不要忽略方法的結果

已建立但從未使用的新物件;或呼叫會建立並傳回新字串的方法,而新字串從未使用過;或者 COM 或 P/Invoke 方法傳回從未使用的 HRESULT 或錯誤碼。

CA1816:正確呼叫 GC.SuppressFinalize

屬於 Dispose 實作的方法不會呼叫 GC.SuppressFinalize,或不屬於 Dispose 實作的方法會呼叫 GC.SuppressFinalize,或呼叫 GC.SuppressFinalize 並傳遞非 this (在 Visual Basic 中為 Me) 的方法。

CA1819:屬性不應傳回陣列

即使屬性是唯讀,所傳回的陣列不會是寫入保護。 若要保持陣列為防止遭他人修改,屬性必須傳回陣列複本。 一般而言,使用者不了解呼叫這類屬性所造成的不良效能影響。

CA1820:應該使用字串長度測試空白字串

使用 String.Length 屬性或 String.IsNullOrEmpty 方法比較字串,明顯地會比使用 Equals 還快。

CA1903:只使用來自目標架構的 API

某一個成員或型別使用的是 Service Pack 中所含的成員或型別,但是專案的目標 Framework 中卻沒有包含該成員或型別。

CA2004:必須移除對 GC.KeepAlive 的呼叫

如果轉換成 SafeHandle 用法,則會移除對 GC.KeepAlive (物件) 的所有呼叫。 在此情況下,類別不一定要呼叫 GC.KeepAlive,假設它們沒有完成項,但會根據 SafeHandle 最終處理其 OS 控制代碼。

CA2006:使用 SafeHandle 封裝原生資源

在 Managed 程式碼中使用 IntPtr,可能會有潛在的安全性和可靠性問題。 必須檢閱所有使用 IntPtr 的情況,判斷是否需要在該處使用 SafeHandle (或類似技術)。

CA2102:在一般處理常式中攔截非 CLSCompliant 的例外狀況

組件中不是以 RuntimeCompatibilityAttribute 標記或是以 RuntimeCompatibility(WrapNonExceptionThrows = false) 標記的成員包含處理 System.Exception 的 catch 區塊,同時不包含緊接其後的一般 catch 區塊。

CA2104:不要宣告唯讀的可變動參考型別

外部可見型別包含了可變動參考型別的外部可見唯讀欄位。 可變動型別是可以修改執行個體 (Instance) 資料的型別。

CA2105:陣列欄位不應為唯讀

當您將唯讀 (在 Visual Basic 中為 ReadOnly) 修飾詞套用至包含陣列的欄位時,欄位就不能變更為參考不同的陣列。 但是,儲存在唯讀欄位的陣列元素則可以變更。

CA2106:必須保護判斷提示

方法會判斷提示使用權限,而且不會在呼叫端上執行安全性檢查。 判斷提示安全性權限但未執行任何安全性檢查,會在您的程式碼中留下可能遭利用的安全性弱點。

CA2115:使用原生資源時必須呼叫 GC.KeepAlive

此規則所偵測的錯誤,可能是因為在 Unmanaged 程式碼仍在使用 Unmanaged 資源時,就完成 Unmanaged 資源所致。

CA2119:密封方法以滿足私用介面的要求

可繼承的公用型別會提供內部 (在 Visual Basic 中為 Friend) 介面的可覆寫方法實作。 若要修正此規則的違規情形,請避免在組件外覆寫方法。

CA2120:必須保護序列化建構函式

這個型別有接受 System.Runtime.Serialization.SerializationInfo 物件和 System.Runtime.Serialization.StreamingContext 物件 (序列化建構函式的簽章) 的建構函式。 這個建構函式未受到安全性檢查的保護,但型別中有一個或多個規則建構函式是受到保護的。

CA2121:靜態建構函式應為私用

系統會在建立型別的第一個執行個體 (Instance) 或參考任何靜態成員之前呼叫靜態建構函式。 如果靜態建構函式不是私用的,則可由系統以外的程式碼呼叫。 視建構函式中執行的作業而定,這會造成非預期的行為。

CA2205:必須使用 Win32 API 的 Managed 對應項

已定義平台叫用方法,而且 .NET Framework Class Library 中有具同等功能的方法存在。

CA2215:Dispose 方法應該呼叫基底類別處置

如果型別會繼承自可處置的型別,則必須從本身的 Dispose 方法呼叫基底型別的 Dispose 方法。

CA2221:完成項應該受到保護

完成項必須使用系列存取修飾詞 (Modifier)。

CA2222:請勿降低繼承成員的可視性

您不得變更繼承成員的存取修飾詞 (Modifier)。 將繼承成員變更為私用不會防止呼叫端存取方法的基底類別 (Base Class) 實作。

CA2223:成員不應該只有在傳回型別上不同

雖然 Common Language Runtime 允許使用傳回型別區分其他部分都相同的成員,但這個功能不屬於 Common Language Specification,也不是 .NET 程式語言共通的功能。

CA2224:多載等號比較運算子時必須一併覆寫 Equals

public 型別會實作等號比較運算子,但不會覆寫 Object.Equals。

CA2226:運算子應該有對稱的多載

型別實作等號比較運算子或不等比較運算子,但未實作相反的運算子。

CA2227:集合屬性應該為唯讀

可寫入的集合屬性允許使用者以不同的集合來取代該集合。 唯讀屬性會從取代過程中停止集合,但是仍然允許設定個別成員。

CA2231:覆寫 ValueType.Equals 時必須一併多載等號比較運算子

實值型別會覆寫 Object.Equals,但不會實作等號比較運算子。

CA2239:必須為選擇性欄位提供還原序列化方法

型別具有以 System.Runtime.Serialization.OptionalFieldAttribute 屬性標示的欄位,而且型別不提供還原序列化事件處理方法。