編寫高質量代碼:改善C#程式的157個建議

作 者:陸敏技 著 。機械工業出版社2011-10-1 出版發行。

基本信息

內容簡介

書籍封面書籍封面

本書是C#程式設計師進階修煉的必讀之作,包含的全部都是C#編碼的最佳實踐,從語言本身、程式的設計和架構、編碼規範和編程習慣等三大方面對C#程式設計師遇到的經典問題給出了經驗性的解決方案,為C#程式設計師如何編寫更高質量的C#代碼提供了157條極為寶貴的建議。對於每一個問題,不僅以建議的方式給出了被實踐證明為十分優秀的解決方案,而且還給出了經常被誤用或被錯誤理解的不好的解決方案,從正反兩個方面進行了分析和對比。

全書一共三個部分,第一部分專注於C#語言本身,一共89條建議,涵蓋了C#語言基本要素、集合、LINQ、泛型、委託、事件、資源管理、序列化、異常處理、異步、多執行緒、任務和並行編程等與C#語法相關的核心內容;第二部分重點講解了C#程式的設計和架構,一共32條建議,涉及成員設計、面向對象的類型設計、安全性設計等重要方面的內容;第三部分探討了C#的編碼規範及編程習慣,一共36條建議,包含C#命名規範、如何使代碼更整潔以及如何規範開發行為等方面的內容。 本書是一本關於如何編寫高質量C#代碼的工具書,列舉的問題非常典型,給出的建議也非常實用,其中的每一條建議都有可能在我們編寫下一行代碼的時候被用到。你可以將此書擱置在案頭,以便有需要的時候隨時查閱。

作者簡介

陸敏技,資深軟體工程師、項目經理和架構師,從事軟體開發工作近10年。尤其精通微軟技術,對C#、WPFWCF、ASP .NET和.NET技術有十分深入的研究,曾參與和主導了大量的相關項目的架構和開發工作,積累了豐富的經驗。此外,他還非常擅長於分散式開發技術,而且有豐富的培訓和授課經驗。活躍於部落格園等技術社區,樂於分享,有較高的知名度和社區影響力。

目錄

前言

第一部分 語言篇

第1章 基本語言要素 / 2

建議1:正確操作字元串 / 2

建議2:使用默認轉型方法 / 6

建議3:區別對待強制轉型與as和is / 9

建議4:TryParse比Parse好 / 12

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

建議6:區別readonly和const的使用方法 / 16

建議7:將0值作為枚舉的默認值 / 19

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

建議9:習慣重載運算符 / 22

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

建議11:區別對待==和Equals / 27

建議12:重寫Equals時也要重寫GetHashCode / 29

建議13:為類型輸出格式化字元串 / 32

建議14:正確實現淺拷貝和深拷貝 / 36

建議15:使用dynamic來簡化反射實現 / 40

第2章 集合和LINQ / 43

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

建議17:多數情況下使用foreach進行循環遍歷 / 45

建議18:foreach不能代替for / 51

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

建議20:使用泛型集合代替非泛型集合 / 54

建議21:選擇正確的集合 / 57

建議22:確保集合的執行緒安全 / 61

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

建議24:疊代器應該是唯讀的 / 67

建議25:謹慎集合屬性的可寫操作 / 68

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

建議27:在查詢中使用Lambda表達式 / 73

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

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

建議30:使用LINQ取代集合中的比較器和疊代器 / 80

建議31:在LINQ查詢中避免不必要的疊代 / 83

第3章 泛型、委託和事件 / 86

建議32:總是優先考慮泛型 / 86

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

建議34:為泛型參數設定約束 / 90

建議35:使用default為泛型類型變數指定初始值 / 92

建議36:使用FCL中的委託聲明 / 94

建議37:使用Lambda表達式代替方法和匿名方法/ 96

建議38:小心閉包中的陷阱 / 99

建議39:了解委託的實質 / 103

建議40:使用event關鍵字為委託施加保護 / 106

建議41:實現標準的事件模型 / 108

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

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

建議44:理解委託中的協變 / 112

建議45:為泛型類型參數指定逆變 / 114

第4章 資源管理和序列化 / 116

建議46:顯式釋放資源需繼承接口IDisposable / 116

建議47:即使提供了顯式釋放方法,也應該在終結器中提供隱式清理 / 119

建議48:Dispose方法應允許被多次調用 / 120

建議49:在Dispose模式中應提取一個受保護的虛方法 / 121

建議50:在Dispose模式中應區別對待託管資源和非託管資源 / 123

建議51:具有可釋放欄位的類型或擁有本機資源的類型應該是可釋放的 / 124

建議52:及時釋放資源 / 125

建議53:必要時應將不再使用的對象引用賦值為null / 127

建議54:為無用欄位標註不可序列化 / 131

建議55:利用定製特性減少可序列化的欄位 / 136

建議56:使用繼承ISerializable接口更靈活地控制序列化過程 / 137

建議57:實現ISerializable的子類型應負責父類的序列化 / 140

第5章 異常與自定義異常 / 144

建議58:用拋出異常代替返回錯誤代碼 / 144

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

建議60:重新引發異常時使用Inner Exception / 150

建議61:避免在finally內撰寫無效代碼 / 151

建議62:避免嵌套異常 / 157

建議63:避免“吃掉”異常 / 160

建議64:為循環增加Tester-doer模式而不是將try-catch置於循環內 / 161

建議65:總是處理未捕獲的異常 / 162

建議66:正確捕獲多執行緒中的異常 / 166

建議67:慎用自定義異常 / 168

建議68:從System.Exception或其他常見的基本異常中派生異常 / 170

建議69:應使用finally避免資源泄漏 / 172

建議70:避免在調用棧較低的位置記錄異常 / 175

第6章 異步、多執行緒、任務和並行 / 177

建議71:區分異步和多執行緒套用場景 / 177

建議72:線上程同步中使用信號量 / 180

建議73:避免鎖定不恰當的同步對象 / 184

建議74:警惕執行緒的IsBackground / 188

建議75:警惕執行緒不會立即啟動 / 189

建議76:警惕執行緒的優先權 / 191

建議77:正確停止執行緒 / 193

建議78:應避免執行緒數量過多 / 194

建議79:使用ThreadPool或BackgroundWorker代替Thread / 196

建議80:用Task代替ThreadPool / 198

建議81:使用Parallel簡化同步狀態下Task的使用 / 202

建議82:Parallel簡化但不等同於Task默認行為 / 204

建議83:小心Parallel中的陷阱 / 205

建議84:使用PLINQ / 208

建議85:Task中的異常處理 / 209

建議86:Parallel中的異常處理 / 214

建議87:區分WPF和WinForm的執行緒模型 / 216

建議88:並行並不總是速度更快 / 220

建議89:在並行方法體中謹慎使用鎖 / 222

第二部分 架構篇

第7章 成員設計 / 226

建議90:不要為抽象類提供公開的構造方法 / 226

建議91:可見欄位應該重構為屬性 / 226

建議92:謹慎將數組或集合作為屬性 / 227

建議93:構造方法應初始化主要屬性和欄位 / 228

建議94:區別對待override和new / 229

建議95:避免在構造方法中調用虛成員 / 235

建議96:成員應優先考慮公開基類型或接口 / 236

建議97:優先考慮將基類型或接口作為參數傳遞 / 237

建議98:用params減少重複參數 / 237

建議99:重寫時不應使用子類參數 / 238

建議100:靜態方法和實例方法沒有區別 / 239

建議101:使用擴展方法,向現有類型“添加”方法 / 240

第8章 類型設計 / 243

建議102:區分接口和抽象類的套用場合 / 243

建議103:區分組合和繼承的套用場合 / 245

建議104:用多態代替條件語句 / 248

建議105:使用私有構造函式強化單例 / 251

建議106:為靜態類添加靜態構造函式 / 253

建議107:區分靜態類和單例 / 255

建議108:將類型標識為sealed / 255

建議109:謹慎使用嵌套類 / 256

建議110:用類來代替enum / 257

建議111:避免雙向耦合/ 260

建議112:將現實世界中的對象抽象為類,將可復用對象圈起來就是命名空間 / 262

第9章 安全性設計 / 264

建議113:聲明變數前考慮最大值 / 264

建議114:MD5不再安全 / 265

建議115:通過HASH來驗證檔案是否被篡改 / 268

建議116:避免用非對稱算法加密檔案 / 269

建議117:使用SSL確保通信中的數據安全 / 273

建議118:使用SecureString保存密鑰等機密字元串 / 284

建議119:不要使用自己的加密算法 / 289

建議120:為程式集指定強名稱/ 289

建議121:為應用程式設定運行許可權 / 291

第三部分 編碼規範及習慣

第10章 命名規範 / 296

建議122:以<Company>.<Component>為命名空間命名 / 296

建議123:程式集不必與命名空間同名 / 296

建議124:考慮在命名空間中使用複數 / 297

建議125:避免用FCL的類型名稱命名自己的類型 / / 297

建議126:用名詞和名詞組給類型命名 / 298

建議127:用形容詞組給接口命名 / 299

建議128:考慮讓派生類的名字以基類名字作為後綴 / 300

建議129:泛型類型參數要以T作為前綴 / 300

建議130:以複數命名枚舉類型,以單數命名枚舉元素 / 301

建議131:用PascalCasing命名公開元素/ 302

建議132:考慮用類名作為屬性名 / 302

建議133:用camelCasing命名私有欄位和局部變數 / 303

建議134:有條件地使用前綴 / 304

建議135: 考慮使用肯定性的短語命名布爾屬性 / 305

建議136:優先使用後綴表示已有類型的新版本 / 306

建議137:委託和事件類型應添加上級後綴 / 307

建議138:事件和委託變數使用動詞或形容詞短語命名 / 308

建議139:事件處理器命名採用組合方式 / 309

第11章 代碼整潔 / 311

建議140:使用默認的訪問修飾符 / 311

建議141:不知道該不該用大括弧時,就用 / 312

建議142:總是提供有意義的命名 / 314

建議143:方法抽象級別應在同一層次 / 315

建議144:一個方法只做一件事 / 316

建議145:避免過長的方法和過長的類 / 317

建議146:只對外公布必要的操作 / 318

建議147:重構多個相關屬性為一個類 / 319

建議148:不重複代碼 / 320

建議149:使用表驅動法避免過長的if和switch分支 / 321

建議150:使用匿名方法、Lambda表達式代替方法 / 324

建議151:使用事件訪問器替換公開的事件成員變數 / 325

建議152:最少,甚至是不要注釋 / 326

建議153:若拋出異常,則必須要注釋 / 326

第12章 規範開發行為 / 327

建議154:不要過度設計,在敏捷中體會重構的樂趣 / 327

建議155:隨生產代碼一起提交單元測試代碼 / 336

建議156:利用特性為應用程式提供多個版本 / 342

建議157:從寫第一個界面開始,就進行自動化測試 / 344

相關搜尋

熱門詞條

聯絡我們