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