Effective C#:改善C#代碼的50個有效方法(原書第3版) ( 簡體 字) |
作者:[美] 比爾·瓦格納(Bill Wagner) 著 | 類別:1. -> 程式設計 -> .NET -> C# |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 49054 詢問書籍請說出此書號!【缺書】 NT售價: 395 元 |
出版日:5/1/2018 |
頁數:250 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111597193 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:本書第1版于2004年出版,到了2016年,C#開發社群的情況已經有了很大的變化。使用這門語言編寫程序的人越來越多,很多人現在都把C#當作首選的工作語言,并且不會再按照使用其他語言時所形成的那些習慣來使用這門語言。此外,C# 開發者所具備的經驗各不相同,從剛畢業的學生到擁有數十年經驗的專業開發者,都有人在用C#寫程序,而且 C# 所支持的平臺也比原來更加廣泛。你可以用它架設服務器或制作網站,也可以為各種操作系統開發桌面版本或移動版本的應用程序。
這次升級的第3版既考慮到C#語言本身的變化,也考慮到使用這門語言的人(或者說 C# 開發社群)所發生的變化。筆者并不打算講述C#語言的演變歷程,而是關注怎樣用好當前版本的 C# 語言。舊版的某些條目已經與當今的 C# 語言或 C# 應用程序脫節了,這些內容不會出現在新版中。新版中會添加一些條目,以講述 C# 語言的新特性與 .NET 框架的新功能,這些內容是從軟件產品的開發過程中提煉出來的,許多C#開發者采用這些特性開發了多個版本的軟件。看過《More Effective C#》第1版的讀者稍后可能會發現,那本書里的某些內容已經移到了本書中。在本書第3版中,筆者重新編排《More Effective C#》的內容,刪除了原有的許多條目,以便在那本書的第2版中添加其他一些條目。總之,這本書里的 50 個條目都是一些編程建議,可以幫助你更為高效地使用 C# 語言,從而成為更加專業的開發者。
本書預設的語境是 6.0 版本的 C#,然而筆者并不會把該版本的功能全都拿出來講。與Effective Software Development系列的其他書一樣,這本書所關注的也是怎樣用語言特性來解決日常工作中可能遇到的問題,并提供實用的建議。在 C# 6.0 版的這些特性中,筆者會特意挑出一些來講,因為其中的某些特性能夠使開發者以更好的方式來編寫常用的代碼。網上搜到的寫法可能是針對許多年前的C#版本而寫的,有了新版C#所引入的特性之后,開發者就可以用更好的寫法來完成那些任務了,對于此類情況,筆者會專門指出。 讀者對象
本書面向的是那些使用 C# 來完成日常工作的職業開發者。由于本書假設讀者已經熟悉了 C# 的語法及語言特性,因此,并不會按部就班地講解這些特性,而是會告訴你應該怎樣把當前這一版 C# 語言所擁有的各種特性融入日常的開發工作中。
除了要熟悉語言本身的特性之外,還應該對 CLR(Common Language Runtime,公共語言運行時)及 JIT(Just-In-Time,即時)編譯器有所了解。
內容提要
有一些語言結構是每次寫 C# 程序時幾乎都會用到的,這些常見的寫法出現在本書的第1章中,它們是開發者手頭必備的工具,無論創建什么樣的類型與算法,都離不開這些工具。
盡管 C# 程序運行在托管環境中,但并不是說開發者什么事情都不用操心。要想令程序的性能滿足需求,就必須編寫出能夠與托管環境相協調的代碼,這不是單靠性能測試與性能調整就可以實現的。因此,第2章會介紹一些設計習慣,告訴你應該怎樣把代碼寫得與托管環境相協調。以良好的設計風格為基礎,可以更加有效地優化細節問題。
自C# 2.0以來所引入的很多新技術都是以泛型為依托的。第3章講解怎樣用泛型取代System.Object以及強制類型轉換,然后,筆者會討論一些高級技術,例如約束、泛型特化、方法約束以及向后兼容等。讀完本章之后,你會學到很多泛型技巧,從而能夠更加順暢地表達出自己的設計思路。
第4章會講解 LINQ、查詢語法以及與之相關的語言特性。你會了解到在哪些情況下應該運用擴展方法把協定與實現相分離,還會學到應該怎樣有效地使用閉包以及如何編寫匿名類型。此外,筆者還會解釋編譯器怎樣把查詢關鍵字映射成方法調用、如何區分委托與表達式樹以及必要時怎樣在二者之間轉換,以及如何對查詢做出轉義以獲取純量形式的結果。
第 5 章會指引你把 C# 程序中的異常與錯誤處理好。筆者要講解怎樣確保程序中的錯誤能夠得到適當的匯報,以及如何令程序的狀態在出錯之后依然保持穩定,甚至與出錯之前一樣。此外,你還會學到怎樣給使用代碼的人提供便利,令他們能夠更加順暢地調試你所編寫的程序。
代碼約定
要想把范例代碼印在書中,就必須在保持清晰的前提下顧及篇幅。筆者盡量把代碼寫得簡短,以凸顯其中最關鍵的部分,并把類或方法中的其他部分省掉。有時為了節省篇幅,還會把錯誤恢復代碼也省掉。public 方法自然應該驗證其參數以及外界輸入給它的數據,但考慮到篇幅,筆者通常會把這些代碼去掉。此外,很多復雜的算法還會對方法調用做出核查,而且會包含try/finally子句,這些代碼也因同樣的理由而刪去。
常見的命名空間就不再寫出了。你可以認為每一份范例代碼前面都寫有下面幾條 using語句 致謝
我要感謝為本書做出貢獻的諸多人士。很榮幸能在這些年里與大家一起使用 C# 語言。C# Insiders 郵件列表中的每位朋友(無論身處 Microsoft 公司之內或之外)都為本書提供了創意,并且愿意與我交流,使我能把這本書寫得更好。
必須特別感謝下面這幾位 C# 開發者:Jon Skeet、Dustin Campbell、Kevin Pilch-Bisson、Jared Parsons、Scott Allen 以及 Mads Torgersen。感謝你們與我溝通、向我提供意見,并將其轉變為具體的成果。這一版的很多新想法都是根據諸位的意見而形成的。
這一版的技術評審團隊同樣很出色。Jason Bock、Mark Michaelis 與 Eric Lippert 仔細閱讀了文稿與范例代碼,以確保讀者能拿到一本優質的書籍。他們的水平相當高,不僅全面而徹底地審閱了本書,而且還提供了一些建議,幫助我把其中的很多話題解釋得更為清楚。
我與Addison-Wesley出版社的編輯團隊合作得相當愉快。Trina Macdonald 是一位優秀的編輯,總能督促我把書寫好。Mark Renfro 與 Olivia Basegio 是她的得力幫手,我依靠他們完成了很多工作,這本書的定稿能夠達到現在這樣的質量,與他們的努力有很大關系,從頭到尾的每一頁內容都是如此。Curt Johnson 致力于發售這本技術圖書,無論是哪種格式都有他的一份心力在里面。
感謝Scott Meyers再度將本書收入 Effective 書系,他閱讀了整部文稿,并提出了一些改進建議。Meyers 雖然不是做 C# 的,但卻有著豐富的軟件開發經驗,能夠把文稿中沒有解釋清楚的地方找出來,而且能指出其中有哪些技巧還不足以總結成心得推薦給大家使用。他的意見,給我帶來了很大的幫助。
感謝家人留出時間,令我可以寫完這本書。我花了很長時間撰寫書稿并制作范例代碼,妻子 Marlene 總是給予我支持。有她的鼓勵,我才能把這本書和其他的書寫好。 |
內容簡介:在本書中,知名的 .NET專家Bill Wagner先生給出了50條建議,告訴你怎樣充分利用 C# 6.0所具備的特性來編寫健壯而高效的代碼。這些建議反映了 C# 開發界的新進展,也令人體會到C#這門語言已經越來越成熟了。在這個新版本中,作者提出了許多種改善代碼品質的新方式,例如怎樣發揮泛型的優勢等。此外,書中還針對 LINQ 給出了很多條建議。全書最后更是專門用一章討論了怎樣處理異常。
Wagner用清晰而誠懇的講解風格、專業的技法,以及實用的范例代碼寫成了這本書,令其成為C#開發者必備的參考資料。書中的話題涵蓋了 C# 語言的各個方面,例如怎樣管理資源、怎樣開發多核程序,以及怎樣避開語言本身及 .NET 環境中的陷阱。作者擁有豐富的經驗,能幫你在諸多方案中選出最為高效的辦法,寫出易于維護且便于改進的代碼。書中詳細解釋了如何踐行下面這些建議,并告訴大家為什么應該這樣做:
■ 優先使用隱式類型的局部變量(第1條)
■ 用內插字符串取代 string.Format()(第4條)
■ 用委托表示回調(第7條)
■ 理解并善用 .NET 的資源管理機制(第11條)
■ 只定義剛好夠用的約束條件(第18條)
■ 通過運行期類型檢查實現特定的泛型算法(第19條)
■ 用委托要求類型參數必須提供某種方法(第23條)
■ 只把必備的契約定義在接口中,把其他功能留給擴展方法去實現(第27條)
■ 把針對序列的 API設計得更加易于拼接(第31條)
■ 將迭代邏輯與操作、謂詞及函數解耦(第32條)
■ 考慮用 lambda 表達式來代替方法(第38條)
■ 掌握盡早執行與延遲執行之間的區別(第40條)
■ 不要把開銷較大的資源捕獲到閉包中(第41條)
■ 考慮在方法約定遭到違背時拋出異常(第45條)
■ 合理利用異常篩選器的副作用來實現某些效果(第50條)
本書能令你從成功的 C# 開發者進化為杰出的編程大師。 |
目錄:本書贊譽 譯者序 前言 第1章 C#語言的編程習慣1 第1條:優先使用隱式類型的局部變量1 第2條:考慮用readonly代替const8 第3條:優先考慮is或as運算符,盡量少用強制類型轉換12 第4條:用內插字符串取代string.Format()20 第5條:用FormattableString取代專門為特定區域而寫的字符串24 第6條:不要用表示符號名稱的硬字符串來調用 API26 第7條:用委托表示回調28 第8條:用null條件運算符調用事件處理程序31 第9條:盡量避免裝箱與取消裝箱這兩種操作34 第10條:只有在應對新版基類與現有子類之間的沖突時才應該使用 new修飾符38 第2章 .NET的資源管理42 第11條:理解并善用 .NET的資源管理機制42 第12條:聲明字段時,盡量直接為其設定初始值47 第13條:用適當的方式初始化類中的靜態成員50 第14條:盡量刪減重復的初始化邏輯52 第15條:不要創建無謂的對象60 第16條:絕對不要在構造函數里面調用虛函數64 第17條:實現標準的dispose 模式67 第3章 合理地運用泛型74 第18條:只定義剛好夠用的約束條件76 第19條:通過運行期類型檢查實現特定的泛型算法82 第20條:通過IComparable及IComparer定義順序關系88 第21條:創建泛型類時,總是應該給實現了IDisposable的類型參數提供支持95 第22條:考慮支持泛型協變與逆變98 第23條:用委托要求類型參數必須提供某種方法104 第24條:如果有泛型方法,就不要 再創建針對基類或接口的 重載版本110 第25條:如果不需要把類型參數所 表示的對象設為實例字段, 那么應該優先考慮創建泛 型方法,而不是泛型類114 第26條:實現泛型接口的同時,還 應該實現非泛型接口118 第27條:只把必備的契約定義在接 口中,把其他功能留給擴 展方法去實現124 第28條:考慮通過擴展方法增強已構造類型的功能128 第4章 合理地運用LINQ131 第29條:優先考慮提供迭代器方法,而不要返回集合131 第30條:優先考慮通過查詢語句來編寫代碼,而不要使用循環語句137 第31條:把針對序列的API設計得更加易于拼接142 第32條:將迭代邏輯與操作、謂詞及函數解耦149 第33條:等真正用到序列中的元素時再去生成153 第34條:考慮通過函數參數來放松耦合關系155 第35條:絕對不要重載擴展方法162 第36條:理解查詢表達式與方法調用之間的映射關系165 第37條:盡量采用惰性求值的方式來查詢,而不要及早求值177 第38條:考慮用lambda表達式來代替方法182 第39條:不要在Func與Action中拋出異常186 第40條:掌握盡早執行與延遲執行之間的區別188 第41條:不要把開銷較大的資源捕獲到閉包中193 第42條:注意IEnumerable與IQueryable形式的數據源之間的區別206 第43條:用Single()及First()來明確地驗證你對查詢結果所做的假設211 第44條:不要修改綁定變量214 第5章 合理地運用異常220 第45條:考慮在方法約定遭到違背時拋出異常220 第46條:利用using與try/finally來清理資源224 第47條:專門針對應用程序創建異常231 第48條:優先考慮做出強異常保證237 第49條:考慮用異常篩選器來改寫先捕獲異常再重新拋出的邏輯244 第50條:合理利用異常篩選器的副作用來實現某些效果248 中英文詞匯對照表252 |
序: |