C#編碼應(yīng)注意的事項(xiàng)清單
2024-07-21 02:19:57
供稿:網(wǎng)友
這是從[email protected]上摘下來的一片文章,原文在那我已經(jīng)記不清了,大概是最近十來天的文章吧,讀了以后,感覺不錯(cuò),不過其中有些地方,我讀了以后,糊里糊涂的就過去了,自己也搞不清其中的含義,不過,我倒是把文章翻譯出來了,現(xiàn)在這兒放著,以后有機(jī)會再該。內(nèi)容如下:
我現(xiàn)在的客戶端廣泛的使用psp(注:程序段前綴),所以我回顧了用在我們項(xiàng)目中的c#代碼,并歸納出一個(gè)清單。非常感激你能對此做出評論
1. 是否使用異常來顯示錯(cuò)誤而不是返回狀態(tài)或錯(cuò)誤代碼?
2. 所有的類和公共方法是否使用.net樣式的注釋?注意,<summary>注釋應(yīng)該論述公共方法是什么。對于怎么使用則應(yīng)該放在<remarks>塊中或是內(nèi)嵌于正被討論的代碼中
3. 如果方法的參數(shù)不正確,是否使用一個(gè)異常來進(jìn)行確認(rèn)和拒絕?
4. debug.asserts是否被用來驗(yàn)證關(guān)于代碼功能的假定?注釋例如:"j will be positive"應(yīng)該被作為斷言(asserts)重寫
5. 那些不應(yīng)該被初始化的類是否有一個(gè)私有的構(gòu)造函數(shù)?
6. 那些被聲明為值類型并極少使用為方法參數(shù)的類是否從方法中返回或是存放在集合(collections)中?
7. 那些被只應(yīng)用在一個(gè)程序集中的類是否被標(biāo)記為internal?
8. 那些能被多線程訪問的單態(tài)類(singletons)是否能夠被正確地初始化?參考 the enterprise solution patterns book, p. 263.
9. 必須被繼承類重載的方法是否被標(biāo)記為abstract?
10. 不應(yīng)該被重載的類是否標(biāo)記為sealed?
11. “as” 是否可能被不正確的使用?
12. 是否類重載 tostring 而不是定義另外一個(gè)方法來輸出對象的狀態(tài)?
13. 是否一個(gè)長的信息被發(fā)送到日志組件而不是控制臺?
14. 一個(gè)finally程序塊是否緊隨一個(gè)try構(gòu)造以用作必須執(zhí)行的代碼?
15. 相對于for(int i…..)構(gòu)造,是否更傾向于使用foreach?
16. 是否使用屬性而不是實(shí)現(xiàn)getter和setter方法?
17. 相對于沒有賦值器的屬性,是否更傾向于使用只讀變量?
18. 被繼承類重載的所有方法是否使用了override關(guān)鍵字?
19. 是否傾向于使用接口類而不是抽象類?
20. 是否寫代碼基于接口而不是一個(gè)實(shí)現(xiàn)類?
21. 那些資源消耗大的對象是否實(shí)現(xiàn)了idisposable接口?
22. 那些實(shí)現(xiàn)了idisposable的對象是否在使用的時(shí)候才初始化?
23. 相對于monitor enter 構(gòu)造,是否更傾向于使用lock關(guān)鍵字?
24. 是否線程被事件或pulse構(gòu)造從等待狀態(tài)激活,而不是調(diào)用sleep()等方式“積極”的等待?
25. 如果重載equals,是否正確地實(shí)現(xiàn)了這一方法?重載equals的規(guī)則是復(fù)雜的,細(xì)節(jié)請參見richter p153-160
26. 如果== 和!=被重載,由此他們重定向到了equals?
27. 是否提供了equals的那些對象也提供了gethashcode的重載版本?gethashcode提供了和equals相同的語義。注意:gethashcode的重載應(yīng)該利用對象的成員變量并且必須返回一個(gè)不再更改的哈希碼。
28. 是否所有的異常類有一個(gè)構(gòu)造函數(shù)帶有一個(gè)字符參數(shù),另外一個(gè)構(gòu)造函數(shù)帶有一個(gè)字符參數(shù)和一個(gè)異常參數(shù)?
29. 是否所有的異常類繼承與基本的matrix異常并正確地適合異常的層次?
30. 是否那些將要被封送或遠(yuǎn)程調(diào)用的類使用了serializable屬性?
31. 是否那些使用了serializable屬性的類,包括exception和eventargsl類型的類,有一個(gè)默認(rèn)的構(gòu)造函數(shù)?
32. 那些實(shí)現(xiàn)了iserializable的類是否即提供了必須的getobjectdata重載也提供了帶有一個(gè)serializeinfo和一個(gè)streamingcontext參數(shù)的構(gòu)造函數(shù)?
33. 在作浮點(diǎn)值運(yùn)算的時(shí)候,是否所有的常量加倍而不是整數(shù)?
34. 是否所有的代理有一個(gè)void返回類型并且避免使用out或ref參數(shù)?
35. 是否繼承于eventargs的類中的所有成員都是只讀?這將阻止一個(gè)預(yù)訂者更改這個(gè)eventargs以免影響另一個(gè)預(yù)訂者。
36. 代理是否被發(fā)布為事件?這將阻止預(yù)訂者引發(fā)事件。詳細(xì)請參見lowy, p. 102
37. 通常的安裝和卸載nunit代碼是否孤立于那些標(biāo)記了合適屬性的安裝和卸載方法?
38. 消極的單元測試是否使用expectedexceptin屬性去顯示一定會拋出某一個(gè)異常
參考:
juval lowy, "programming .net components"
jeffrey richter, "applied microsoft .net framework programming"
"enterprise solution patterns using microsoft .net" - available in published form or as a free pdf