設計規則
設計規則支援遵循 .NET Framework 設計指導方針 。
本節內容
規則 | 描述 |
---|---|
CA1000:不要在泛型類型上宣告靜態成員 | 呼叫泛型類型的靜態成員時,必須為類型指定類型引數。 呼叫不支援介面的泛型執行個體 (Instance) 成員時,必須為成員指定類型引數。 在上述兩種情況下,指定型別引數的語法不同且容易混淆。 |
CA1001:具有可處置欄位的類型應該為可處置 | 類別會宣告並實作 System.IDisposable 類型的實例欄位,而 類別不會實作 IDisposable。 宣告 IDisposable 欄位的類別會間接擁有 Unmanaged 資源,且應實作 IDisposable 介面。 |
CA1002:不要公開泛型清單 | System.Collections.Generic.List<(Of <(T>)>) 是專為效能而非繼承所設計的泛型集合。 因此,List 不包含任何虛擬成員。 應該改為公開專為繼承所設計的泛型集合。 |
CA1003:使用一般事件處理常式執行個體 | 類型包含傳回 void 的委派,其簽章包含兩個參數(第一個是物件,第二個是可指派給 EventArgs 的類型),而包含的元件是以 .NET Framework 2.0 為目標。 |
CA1005:避免在泛型類型上包含過多參數 | 泛型類型所包含的類型參數越多,就越難了解並記住每個類型參數所代表的含意。 通常很明顯地有一個類型參數,如 List < T > ,而在某些情況下,有兩個類型參數,如字典 < TKey,TValue > 。 不過,如果存在兩個以上的類型參數,則對大多數使用者而言都會變得難以理解。 |
CA1008:列舉值中應該要有值為零的成員 | 如同其他實值類型一般,未初始化的列舉其預設值為零。 非旗標屬性列舉應該使用零的值來定義成員,讓預設值是列舉的有效值。 如果已套用 FlagsAttribute 屬性的列舉定義零值成員,則其名稱應該是 "None",以表示列舉中未設定任何值。 |
CA1010:集合應該實作泛型介面 | 若要放寬集合的可用性,請實作其中一個泛型集合介面。 接著,使用該集合填入泛型集合類型。 |
CA1012:抽象類別型不應該有公用建構函式 | 只有衍生類型 (Derived Type) 可以呼叫抽象類型上的建構函式。 因為公用建構函式會建立類型的執行個體,而且您無法建立抽象類型的執行個體,因此具有公用建構函式的抽象類型設計不正確。 |
CA1014:組件必須標記 CLSCompliantAttribute | Common Language Specification (CLS) 會定義命名限制、資料類型及組件必須遵守的規則 (如果組件會使用於跨程式設計語言時)。 良好的設計規定所有元件都會使用 CLSCompliantAttribute 明確指出 CLS 合規性。 如果這個屬性未出現於組件中,則表示組件不符合標準。 |
CA1016:組件必須標記 AssemblyVersionAttribute | .NET 會使用版本號碼來唯一識別元件,以及系結至強式名稱元件中的類型。 版本號碼會與版本和發行者 (Publisher) 原則一起使用。 應用程式預設只會與建置它們的組件版本一起執行。 |
CA1017:組件必須標記 ComVisibleAttribute | ComVisibleAttribute 會判斷 COM 用戶端如何存取 Managed 程式碼。 良好的設計會要求組件明確表示 COM 的可視性。 COM 的可視性可以針對整個組件進行設定,然後針對個別類型及類型成員進行覆寫。 如果這個屬性不存在,則 COM 用戶端可以看到組件的內容。 |
CA1018:必須以 AttributeUsageAttribute 標記屬性 | 當您定義自訂屬性時,請使用 AttributeUsageAttribute 標記它,以指出可以在原始程式碼的哪個位置套用自訂屬性。 屬性的意義和預期的用法將決定它在程式碼中的有效位置。 |
CA1019:定義屬性引數的存取子 | 屬性可以定義必須在將屬性套用至目標時指定的強制引數。 這些引數也稱為位置引數,因為它們會當做位置參數提供給屬性建構函式。 對於每個強制引數而言,屬性 (Attribute) 還須提供對應的唯讀屬性 (Property),才可以在執行時期擷取引數值。 屬性也可以定義選擇性引數,也稱為具名引數。 這些引數會依照名稱提供給屬性 (Attribute) 建構函式,且必須有對應的讀取/寫入屬性 (Property)。 |
CA1021:避免使用 out 參數 | 以傳址方式傳遞類型時 (使用 out 或 ref),您需要擁有使用指標的經驗、了解實值類型和參考類型之間的差異,並處理具有多個傳回值的方法。 此外,out 和 ref 參數之間的差異一般人不甚了解。 |
CA1024:建議在適當時使用屬性 | 公用或保護的方法具有以 "Get" 開頭的名稱,該名稱不採用任何參數並且會傳回不是陣列的值。 此方法可能是成為屬性的不錯候選者。 |
CA1027:必須以 FlagsAttribute 標記列舉 | 列舉類型是一種實值類型 (Value Type),用以定義一組相關的具名常數。 當列舉的具名常數可以有意義地加以結合時,會將 FlagsAttribute 套用至此列舉。 |
CA1028:列舉儲存區應該是 Int32 | 列舉類型是一種實值類型 (Value Type),用以定義一組相關的具名常數。 根據預設,System.Int32 資料類型會用於儲存常數值。 雖然您可以變更此基礎類型,但大部分案例都不需要或建議使用。 |
CA1030:建議在適當時使用事件 | 此規則會偵測具有事件常用名稱的方法。 如果方法因回應清楚定義的狀態變更而被呼叫,應該由事件處理常式叫用該方法。 呼叫方法的物件應該要引發事件,而不是直接呼叫方法。 |
CA1031:不要攔截一般例外狀況類型 | 不應該攔截一般例外狀況。 擷取更特定的例外狀況,或重新擲回一般例外狀況作為 catch 區塊中的最後一個語句。 |
CA1032:必須實作標準例外狀況建構函式 | 無法提供整組的建構函式會導致難以正確地處理例外狀況。 |
CA1033:介面方法應該要可以由子類型呼叫 | 非密封外部可見的類型會提供公用介面的明確方法實作,但未提供同名的替代外部可見方法。 |
CA1034:巢狀類型不應該為可見的 | 巢狀類型是在其他類型範圍內宣告的類型。 巢狀類型可用來封裝包含類型 (Containing Type) 私用的 (Private) 實作細節。 因為有這樣的用途,所以巢狀類型不應為外部可見的。 |
CA1036:必須在 Comparable 類型中覆寫方法 | 公用或受保護的類型實作 System.IComparable 介面。 它不會覆寫 Object.Equals,也不會多載等號、不等、小於或大於的語言特定比較運算子。 |
CA1040:避免使用空的介面 | 介面是用來定義一組可提供行為或程式使用合約的成員。 不論類型出現在繼承階層架構 (Inheritance Hierarchy) 中的何處,任何類型都可以採用介面所描述的功能。 類型會實作介面,方法是提供介面成員的實作。 空白介面不會定義任何成員,因此也不會定義能夠實作的合約。 |
CA1041:必須提供 ObsoleteAttribute 訊息 | 類型或成員是使用並未指定其 ObsoleteAttribute.Message 屬性 (Property) 的 System.ObsoleteAttribute 屬性 (Attribute) 來標記。 編譯使用 ObsoleteAttribute 標記的類型或成員時,會顯示 屬性的 Message 屬性,這會為使用者提供過時類型或成員的相關資訊。 |
CA1043:必須針對索引子使用整數或字串引數 | 索引子 (也就是索引的屬性) 應該使用整數類型或字串類型的索引。 這些類型通常會用於資料結構的索引,可以提升程式庫的可用性。 Object 類型的使用應限制於無法在設計階段指定特定整數類型或字串類型的情況。 |
CA1044:屬性不應該為唯寫的 | 雖然它是可接受並經常需要具有唯讀屬性,設計方針會禁止使用唯寫屬性的屬性。 這是因為讓使用者,設定一個值,然後防止使用者檢視值並不會提供任何安全性。 同時,如果沒有讀取權限,則無法檢視共用物件的狀態,進而限制這些物件的使用性。 |
CA1045:不要以傳址方式傳遞類型 | 以傳址方式傳遞類型時 (使用 out 或 ref),您需要擁有使用指標的經驗、了解實值類型和參考類型之間的差異,並處理具有多個傳回值的方法。 為一般物件設計的程式庫架構設計人員不應該期望使用者熟悉使用或 ref 參數。 |
CA1046:不要多載參考類型上的等號比較運算子 | 對參考類型而言,等號比較運算子的預設實作 (Implementation) 永遠都是正確的。 根據預設,只有當兩項參考都指向相同物件時才會相等。 |
CA1047:不要在密封類型中宣告 protected 成員 | 類型會宣告 protected 成員,如此繼承的類型即可存取或覆寫成員。 根據定義,密封類型無法被繼承,這表示無法呼叫密封類型上的受保護方法。 |
CA1050:類型必須在命名空間中宣告 | 類型會在命名空間之內宣告以防止名稱衝突,而且可當做組織物件階層架構中相關類型的一種方法。 |
CA1051:不要宣告可見的執行個體欄位 | 欄位的主要用法應該是當做實作詳細資料。 欄位應該是私用或內部的,而且應使用屬性公開。 |
CA1052:靜態預留位置類型應該為密封的 | 公用或受保護的類型只包含靜態成員,而且不會使用 sealed (C#) 或 NotInheritable (Visual Basic) 修飾詞來宣告。 預定不會繼承的類型應該使用 sealed 修飾詞來標記,以禁止使用它做為基底類型。 |
CA1053:靜態預留位置類型不應該包含建構函式 | 公用或巢狀公用類型只宣告靜態成員,而且具有公用或保護的預設建構函式。 建構函式不是必要的,因為呼叫靜態成員不需類型的執行個體。 為了安全,字串多載應該使用字串引數來呼叫統一資源識別項 (URI) 多載。 |
CA1054:URI 參數不應該為字串 | 如果方法使用 URI 字串表示,應該提供採用 URI 類別的對應多載,這樣就可以透過安全的方式提供這些服務。 |
CA1055:URI 傳回值不應該為字串 | 這項規則假設方法會傳回 URI。 URI 的字串表示方式容易發生剖析和編碼錯誤,並且可能因此產生安全性弱點。 System.Uri 類別以安全的方式提供這些服務。 |
CA1056:URI 屬性不應該為字串 | 此規則假設 屬性代表 URI。 URI 的字串表示方式容易發生剖析和編碼錯誤,並且可能因此產生安全性弱點。 System.Uri 類別以安全的方式提供這些服務。 |
CA1058:類型不應該擴充特定基底類型 | 外部可見的類型會延伸某些基底類型 (Base Type)。 請使用其他作法。 |
CA1060:將 P/Invokes 移到 NativeMethods 類別 | 平台叫用方法,例如 System.Runtime.InteropServices.DllImportAttribute 使用 Visual Basic 中的 Declare 關鍵字所定義的 或 方法,存取 Unmanaged 程式碼。 這些方法應該是 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods 類別。 |
CA1061:不要隱藏基底類別方法 | 只有在衍生方法的參數簽章因類型衍生時比基底方法參數簽章中的類型還要弱時,基底類型中的方法才會被衍生類型中的相同具名方法所隱藏。 |
CA1062:必須驗證公用方法的引數 | 所有傳遞至外部可見方法的參考引數都應經過 null 檢查。 |
CA1063:必須正確實作 IDisposable | 所有的 IDisposable 類型都需正確地實作 Dispose 模式。 |
CA1064:例外狀況必須是公用 | 內部例外狀況只會在自己的內部範圍內顯示。 當例外狀況超出內部範圍後,只能使用基本例外狀況來攔截例外狀況。 如果內部例外狀況是繼承自 System.Exception、System.SystemException 或 System.ApplicationException,外部程式碼就沒有足夠的資訊可以知道應該如何處理此例外狀況。 |
CA1065:不要在非預期的位置中引發例外狀況 | 不可擲回例外狀況 (Exception) 的方法卻擲回例外狀況。 |
CA1066:覆寫 Equals 時實作 IEquatable | 實值型別會覆寫 Equals 方法,但不會實作 IEquatable<T>。 |
CA1067:實作 IEquatable 時覆寫 Equals | 型別會實作 IEquatable<T>,但不會覆寫 Equals 方法。 |
CA1068:CancellationToken 參數必須位於最後 | 方法具有不是最後一個參數的 CancellationToken 參數。 |
CA1069:列舉不能有重複的值 | 列舉具有多個明確指派相同常數值的成員。 |
CA1070:請勿將事件欄位宣告為 virtual | field-like event 已宣告為虛擬。 |