[轉]C#編碼應注意的事項清單
1. 是否使用異常來顯示錯誤而不是返回狀態或錯誤碼?
2. 所有的類和公用方法是否使用.NET樣式的注釋?注意,<summary>注釋應該論述公用方法是什麼。對於怎麼使用則應該放在<remarks>塊中或是內嵌於正被討論的代碼中
3. 如果方法的參數不正確,是否使用一個異常來進行確認和拒絕?
4. Debug.Asserts是否被用來驗證關於代碼功能的假定?注釋例如:"j will be positive"應該被作為斷言(Asserts)重寫
5. 那些不應該被初始化的類是否有一個私人的建構函式?
6. 那些被聲明為實值型別並極少使用為方法參數的類是否從方法中返回或是存放在集合(Collections)中?
7. 那些被只應用在一個程式集中的類是否被標記為internal?
8. 那些能被多線程訪問的單態類(Singletons)是否能夠被正確地初始化?參考 the Enterprise Solution Patterns book, p. 263.
9. 必須被繼承類重載的方法是否被標記為abstract?
10. 不應該被重載的類是否標記為sealed?
11. “as” 是否可能被不正確的使用?
12. 是否類重載 ToString 而不是定義另外一個方法來輸出對象的狀態?
13. 是否一個長的資訊被發送到日誌組件而不是控制台?
14. 一個finally程式塊是否緊隨一個try構造以用作必須執行的代碼?
15. 相對於for(int i…..)構造,是否更傾向於使用foreach?
16. 是否使用屬性而不是實現getter和setter方法?
17. 相對於沒有賦值器的屬性,是否更傾向於使用唯讀變數?
18. 被繼承類重載的所有方法是否使用了override關鍵字?
19. 是否傾向於使用介面類而不是抽象類別?
20. 是否寫代碼基於介面而不是一個實作類別?
21. 那些資源消耗大的對象是否實現了IDisposable介面?
22. 那些實現了IDisposable的對象是否在使用的時候才初始化?
23. 相對於Monitor Enter 構造,是否更傾向於使用lock關鍵字?
24. 是否線程被事件或Pulse構造從等待狀態啟用,而不是調用Sleep()等方式“積極”的等待?
25. 如果重載equals,是否正確地實現了這一方法?重載equals的規則是複雜的,細節請參見Richter p153-160
26. 如果== 和!=被重載,由此他們重新導向到了Equals?
27. 是否提供了Equals的那些對象也提供了GetHashCode的重載版本?GetHashCode提供了和Equals相同的語義。注意:GetHashCode的重載應該利用對象的成員變數並且必須返回一個不再更改的雜湊碼。
28. 是否所有的異常類有一個建構函式帶有一個字元參數,另外一個建構函式帶有一個字元參數和一個異常參數?
29. 是否所有的異常類繼承與基本的Matrix異常並正確地適合異常的層次?
30. 是否那些將要被封送或遠程調用的類使用了Serializable屬性?
31. 是否那些使用了Serializable屬性的類,包括Exception和EventArgsl類型的類,有一個預設的建構函式?
32. 那些實現了ISerializable的類是否即提供了必須的GetObjectData重載也提供了帶有一個SerializeInfo和一個StreamingContext參數的建構函式?
33. 做浮點運算時,是否所有常量都應用double類型而非int類型?
34. 是否所有的代理有一個void傳回型別並且避免使用out或ref參數?
35. 是否繼承於EventArgs的類中的所有成員都是唯讀?這將阻止一個預訂者更改這個EventArgs以免影響另一個預訂者。
36. 代理是否被發布為事件?這將阻止預訂者引發事件。詳細請參見Lowy, p. 102
37. 通常的安裝和卸載nUnit代碼是否孤立於那些標記了合適屬性的安裝和卸載方法?
38. 消極的單元測試是否使用ExpectedExceptin屬性去顯示一定會拋出某一個異常
1. 是否使用異常來顯示錯誤而不是返回狀態或錯誤碼?
2. 所有的類和公用方法是否使用.NET樣式的注釋?注意,<summary>注釋應該論述公用方法是什麼。對於怎麼使用則應該放在<remarks>塊中或是內嵌於正被討論的代碼中
3. 如果方法的參數不正確,是否使用一個異常來進行確認和拒絕?
4. Debug.Asserts是否被用來驗證關於代碼功能的假定?注釋例如:"j will be positive"應該被作為斷言(Asserts)重寫
5. 那些不應該被初始化的類是否有一個私人的建構函式?
6. 那些被聲明為實值型別並極少使用為方法參數的類是否從方法中返回或是存放在集合(Collections)中?
7. 那些被只應用在一個程式集中的類是否被標記為internal?
8. 那些能被多線程訪問的單態類(Singletons)是否能夠被正確地初始化?參考 the Enterprise Solution Patterns book, p. 263.
9. 必須被繼承類重載的方法是否被標記為abstract?
10. 不應該被重載的類是否標記為sealed?
11. “as” 是否可能被不正確的使用?
12. 是否類重載 ToString 而不是定義另外一個方法來輸出對象的狀態?
13. 是否一個長的資訊被發送到日誌組件而不是控制台?
14. 一個finally程式塊是否緊隨一個try構造以用作必須執行的代碼?
15. 相對於for(int i…..)構造,是否更傾向於使用foreach?
16. 是否使用屬性而不是實現getter和setter方法?
17. 相對於沒有賦值器的屬性,是否更傾向於使用唯讀變數?
18. 被繼承類重載的所有方法是否使用了override關鍵字?
19. 是否傾向於使用介面類而不是抽象類別?
20. 是否寫代碼基於介面而不是一個實作類別?
21. 那些資源消耗大的對象是否實現了IDisposable介面?
22. 那些實現了IDisposable的對象是否在使用的時候才初始化?
23. 相對於Monitor Enter 構造,是否更傾向於使用lock關鍵字?
24. 是否線程被事件或Pulse構造從等待狀態啟用,而不是調用Sleep()等方式“積極”的等待?
25. 如果重載equals,是否正確地實現了這一方法?重載equals的規則是複雜的,細節請參見Richter p153-160
26. 如果== 和!=被重載,由此他們重新導向到了Equals?
27. 是否提供了Equals的那些對象也提供了GetHashCode的重載版本?GetHashCode提供了和Equals相同的語義。注意:GetHashCode的重載應該利用對象的成員變數並且必須返回一個不再更改的雜湊碼。
28. 是否所有的異常類有一個建構函式帶有一個字元參數,另外一個建構函式帶有一個字元參數和一個異常參數?
29. 是否所有的異常類繼承與基本的Matrix異常並正確地適合異常的層次?
30. 是否那些將要被封送或遠程調用的類使用了Serializable屬性?
31. 是否那些使用了Serializable屬性的類,包括Exception和EventArgsl類型的類,有一個預設的建構函式?
32. 那些實現了ISerializable的類是否即提供了必須的GetObjectData重載也提供了帶有一個SerializeInfo和一個StreamingContext參數的建構函式?
33. 做浮點運算時,是否所有常量都應用double類型而非int類型?
34. 是否所有的代理有一個void傳回型別並且避免使用out或ref參數?
35. 是否繼承於EventArgs的類中的所有成員都是唯讀?這將阻止一個預訂者更改這個EventArgs以免影響另一個預訂者。
36. 代理是否被發布為事件?這將阻止預訂者引發事件。詳細請參見Lowy, p. 102
37. 通常的安裝和卸載nUnit代碼是否孤立於那些標記了合適屬性的安裝和卸載方法?
38. 消極的單元測試是否使用ExpectedExceptin屬性去顯示一定會拋出某一個異常