C#編碼應(yīng)注意的事項(xiàng)清單
發(fā)表時(shí)間:2024-02-23 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]這是從WebBlog@Asp.Net上摘下來(lái)的一片文章,原文在那我已經(jīng)記不清了,大概是最近十來(lái)天的文章吧,讀了以后,感覺不錯(cuò),不過(guò)其中有些地方,我讀了以后,糊里糊涂的就過(guò)去了,自己也搞不清其中的含義,不過(guò),我倒是把文章翻譯出來(lái)了,現(xiàn)在這兒放著,以后有機(jī)會(huì)再該。內(nèi)容如下:我現(xiàn)在的客戶端廣泛的使用PS...
這是從WebBlog@Asp.Net上摘下來(lái)的一片文章,原文在那我已經(jīng)記不清了,大概是最近十來(lái)天的文章吧,讀了以后,感覺不錯(cuò),不過(guò)其中有些地方,我讀了以后,糊里糊涂的就過(guò)去了,自己也搞不清其中的含義,不過(guò),我倒是把文章翻譯出來(lái)了,現(xiàn)在這兒放著,以后有機(jī)會(huì)再該。內(nèi)容如下:
我現(xiàn)在的客戶端廣泛的使用PSP(注:程序段前綴),所以我回顧了用在我們項(xiàng)目中的c#代碼,并歸納出一個(gè)清單。非常感激你能對(duì)此做出評(píng)論
1. 是否使用異常來(lái)顯示錯(cuò)誤而不是返回狀態(tài)或錯(cuò)誤代碼?
2. 所有的類和公共方法是否使用.NET樣式的注釋?注意,<summary>注釋應(yīng)該論述公共方法是什么。對(duì)于怎么使用則應(yīng)該放在<remarks>塊中或是內(nèi)嵌于正被討論的代碼中
3. 如果方法的參數(shù)不正確,是否使用一個(gè)異常來(lái)進(jìn)行確認(rèn)和拒絕?
4. Debug.Asserts是否被用來(lái)驗(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. 那些能被多線程訪問(wèn)的單態(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è)方法來(lái)輸出對(duì)象的狀態(tài)?
13. 是否一個(gè)長(zhǎng)的信息被發(fā)送到日志組件而不是控制臺(tái)?
14. 一個(gè)finally程序塊是否緊隨一個(gè)try構(gòu)造以用作必須執(zhí)行的代碼?
15. 相對(duì)于for(int i…..)構(gòu)造,是否更傾向于使用foreach?
16. 是否使用屬性而不是實(shí)現(xiàn)getter和setter方法?
17. 相對(duì)于沒有賦值器的屬性,是否更傾向于使用只讀變量?
18. 被繼承類重載的所有方法是否使用了override關(guān)鍵字?
19. 是否傾向于使用接口類而不是抽象類?
20. 是否寫代碼基于接口而不是一個(gè)實(shí)現(xiàn)類?
21. 那些資源消耗大的對(duì)象是否實(shí)現(xiàn)了IDisposable接口?
22. 那些實(shí)現(xiàn)了IDisposable的對(duì)象是否在使用的時(shí)候才初始化?
23. 相對(duì)于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é)請(qǐng)參見Richter p153-160
26. 如果== 和!=被重載,由此他們重定向到了Equals?
27. 是否提供了Equals的那些對(duì)象也提供了GetHashCode的重載版本?GetHashCode提供了和Equals相同的語(yǔ)義。注意:GetHashCode的重載應(yīng)該利用對(duì)象的成員變量并且必須返回一個(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ì)請(qǐng)參見Lowy, p. 102
37. 通常的安裝和卸載nUnit代碼是否孤立于那些標(biāo)記了合適屬性的安裝和卸載方法?
38. 消極的單元測(cè)試是否使用ExpectedExceptin屬性去顯示一定會(huì)拋出某一個(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