編寫高質量代碼改善C#程序的157個建議——導航開篇


前言

  由於最近工作重心的轉移,原來和幾個同事一起開發的項目也已經上線了,而新項目就是在現有的項目基礎上進行優化延伸擴展。打個比方,現在已經上線的項目行政案件的Web管理網站(代碼還沒那么多相比較即將要做的刑事案件吧),而新項目是刑事案件的Web管理網站,之后行政和刑事這兩個網站是要合並的。前段時間也和同事以及上司的討論結果就是新建一套項目,考慮將原有系統各種組件進行重新封裝、優化、提升擴展,然后先開發刑事案件的網站,待刑事案件開發完畢將原有項目按照刑事案件的思路重新整合。

  最近剛開始進行查看老代碼也發現太多的問題,感覺無從下手,有些東西當時都是只是實現了功能而已,由於自己經歷和經驗都還很有限。所以打算來學習一下,無獨有偶發現了這本書,哈哈,自己感覺也很不錯,所以想在此做下筆記。

                                                         

為什么要來看這本書

   寫此書的作者在書中也有明確的記錄。作者一直在思考一個問題:就是到底什么樣的編程書籍能夠幫助入門者快速進階?所謂“入門者”指的是已經可以使用一門語言來編寫程序,但是不太明白如何編寫高質量代碼的人。作者回憶自己開發生涯的入門階段發現,那時候常常被以下三類問題所困擾。

  第一類來自於語言本身。

  1、如何格式化字符串才是最高效的?

  2、基本類型間或其他CLR類型間的轉換怎樣才算是最高效的?

  3、for和foreach有什么區別,何時該用for,何時又該用foreach?

  4、什么是Dispose模式,為什么要釋放資源,如何釋放資源?

  5、多線程應該選擇何種方式來開啟和結束,各線程之間為什么要同步,如何同步,如何鎖定資源?

  第二類來自於設計框架如果你對編程充滿熱愛,相信你的大腦很快就會充滿以下這些問題

  1、使用單例模式還是靜態類,為什么有了靜態類還需要單例模式?

  2、該使用靜態方法還是實例方法,它們的本質區別是什么?

  3、如何使用異常才是最正確的,什么時候拋出異常,什么時候“吃掉”異常,為什么需要自定義異常?

  4、如何避免過多的條件判斷分支?

  5、如何保證程序的數據安全和通信安全?

  第三類問題最常見,可能來自於編碼習慣和編程思想。

  1、一個文件只包含一個類比較好,還是一個文件可以包含多個類?

  2、如何命名才是專業級別的?

  3、應該使用抽象類還是接口?

  4、到底什么才是真正的面向對象編碼,我這樣編程夠面向對象嗎?

  5、什么是單元測試,如何編寫單元測試?

如果你也曾問過自己類似的問題,說明你已經為專業程序員做好了准備了。當然如果你還是苦於找不到答案的話,或許你也可以來閱讀下此書,相信你會收獲頗豐的。自己大致看了一下此書,感覺作者還是花了很多心思的,很多知識講解的還是都很不錯的,在此也只是希望更多的人受益,當然不喜勿噴額。

本書大綱目錄

 第一部分 語言篇

  1、第一章 基本語言要素

http://www.cnblogs.com/aehyok/p/3624478.html[1-3]

  建議1、正確使用字符串

  建議2、使用默認轉型方法

  建議3、區別對待強制轉型與as和is

http://www.cnblogs.com/aehyok/p/3629760.html[4-9]

  建議4、TryParse比Parse好

  建議5、使用int?來確保值類型也可以為null

  建議6、區別readonly和const的使用方法

  建議7、將0值作為枚舉的默認值

  建議8、避免給枚舉類型的元素提供顯式的值

  建議9、習慣重載運算符

http://www.cnblogs.com/aehyok/p/3631483.html[10-12]

  建議10、創建對象時需要考慮是否實現比較器

  建議11、區別對待==和Equals

  建議12、重寫Equals時也要重寫GetHashCode

http://www.cnblogs.com/aehyok/p/3634984.html[13-15]

  建議13、為類型輸出格式化字符串

  建議14、正確實現淺拷貝和深拷貝

  建議15、使用dynamic來簡化發射實現

  2、第二章 集合和LINQ

http://www.cnblogs.com/aehyok/p/3637504.html[16-19]

  建議16、元素數量可變的情況下不應使用數組

  建議17、在多數情況下使用foreach進行循環遍歷

  建議18、foreach不能代替for

  建議19、使用更有效的對象和集合初始化

http://www.cnblogs.com/aehyok/p/3641896.html[20-22]

  建議20、使用泛型集合來替代非泛型集合

  建議21、選擇正確的集合

  建議22、確保集合的線性安全

http://www.cnblogs.com/aehyok/p/3657862.html [23-25]

  建議23、避免將List<T>作為自定義集合類的基類 

  建議24、迭代器應該是只讀的

  建議25、謹慎集合屬性的可寫操作

http://www.cnblogs.com/aehyok/p/3674866.html [26-28]

  建議26、使用匿名類型儲存LINQ查詢結果

  建議27、在查詢中使用Lambda表達式

  建議28、理解延遲求值和主動求值之間的區別

http://www.cnblogs.com/aehyok/p/3712725.html[29-31]

  建議29、區別LINQ查詢中的IEnumerable<T>和IQueryable<T>

  建議30、使用LINQ取代集合中的比較器和迭代器

  建議31、在LINQ查詢中避免不必要的迭代

  3、第三章 泛型、委托和事件

http://www.cnblogs.com/aehyok/p/3719825.html [32-34]

  建議32、總是優先考慮泛型

  建議33、避免在泛型類型中聲明靜態成員

  建議34、為泛型參數設定約束

http://www.cnblogs.com/aehyok/p/3725313.html[35-37]

  建議35、使用default為泛型類型指定初始值

  建議36、使用FCL中的委托聲明

  建議37、使用lambda表達式代替方法和匿名方法

http://www.cnblogs.com/aehyok/p/3730417.html[38-41]

  建議38、小心閉包中的陷阱

  建議39、了解委托的實質

  建議40、使用event關鍵字對委托施加保護

  建議41、實現標准的事件模型

http://www.cnblogs.com/aehyok/p/3737426.html[42-45]

  建議42、使用泛型參數兼容泛型接口的不可變性

  建議43、讓接口中的泛型參數支持協變

  建議44、理解委托中的協變

  建議45、為泛型類型參數指定協變

  4、第四章 資源管理和序列化

  5、第五章 異常和自定義異常

http://www.cnblogs.com/aehyok/p/3750122.html[58-60]

  建議58、用拋出異常代替返回錯誤代碼

  建議59、不要在不恰當的場合下引發異常

  建議60、重新引發異常時使用inner Exception

http://www.cnblogs.com/aehyok/p/3761583.html[61-64]

  建議61、避免在finally內撰寫無效代碼

  建議62、避免嵌套異常

  建議63、避免“吃掉”異常

  建議64、為循環增加Tester-Doer模式而不是將try-catch置於循環內

  6、第六章 異步、多線程、任務和並行

第二部分  架構篇

  7、第七章 成員設計

  8、第八章 類型設計

  9、第九章 安全性設計

第三部分 編碼規范及習慣

  10、第十章 命名規范

  11、第十一章 代碼整潔

  12、第十二章 規范開發行為

總結

   從書的開頭看起到目錄,這本書真真的深深的吸引了我,好像就如作者所說,正中下懷一樣。作者所想的那三類問題,有些問題我曾經的確也考慮過,要去找為什么,但是后來放棄了,或者遺忘了,不過今天終於又讓我看到了這似曾相識的感覺,這次我要將這些問題一一的剖解,希望自己能多多的學習書中的知識和奧妙吧。

  看了上面的,也許很多人和我有同樣的想法,要好好來看看這本書,那么我希望大家可以將看書后的一些想法或者問題,發布出來讓大家一起來探討一下,讓我等菜鳥也可以多多的見識見識。暫時我也在考慮要不要入手一本,這不剛剛在網上下載的PDF。由於此書的章節並沒有關聯性,也可以是你需要那些知識,直接看那些章節就可以了。所以自己打算在工作中遇到問題可以直接對症下葯了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM