第1章 概述 1
1.1 精心設計的框架所具備的品質 2
1.1.1 精心設計的框架是簡單的 2
1.1.2 精心設計的框架設計代價高 3
1.1.3 精心設計的框架充滿利弊權衡 4
1.1.4 精心設計的框架應該藉鑒過去的經驗 4
1.1.5 精心設計的框架要考慮未來發展 4
1.1.6 精心設計的框架應具有良好的集成性 5
1.1.7 精心設計的框架是一緻的 5
第2章 框架設計基礎 7
2.1 漸進框架 9
2.2 框架設計的基本原則 12
2.2.1 圍繞場景進行設計的原則 12
2.2.2 低門檻原則 18
2.2.3 自說明對象模型原則 22
2.2.4 分層架構原則 28
2.3 小結 30
第3章 命名規範 31
3.1 大小寫約定 31
3.1.1 標識符的大小寫規則 32
.3.1.2 首字母縮寫詞的大小寫 34
3.1.3 復閤詞和常用術語的大小寫 36
3.1.4 是否區分大小寫 37
3.2 通用命名約定 38
3.2.1 單詞的選擇 38
3.2.2 使用單詞縮寫和首字母縮寫詞 40
3.2.3 避免使用編程語言特有的名字 41
3.2.4 為已有api的新版本命名 43
3.3 程序集和dll的命名 45
3.4 名字空間的命名 46
3.5 類、結構和接口的命名 50
3.5.1 泛型類型參數的命名 53
3.5.2 常用類型的命名 53
3.5.3 枚舉類型的命名 54
3.6 類型成員的命名 56
3.6.1 方法的命名 56
3.6.2 屬性的命名 57
3.6.3 事件的命名 58
3.6.4 字段的命名 59
3.7 參數的命名 60
3.8 資源的命名 61
3.9 小結 62
第4章 類型設計規範 63
4.1 類型和名字空間 65
4.2 類和結構之間的選擇 70
4.3 類和接口之間的選擇 73
4.4 抽象類的設計 79
4.5 靜態類的設計 80
4.6 接口的設計 82
4.7 結構的設計 84
4.8 枚舉的設計 86
4.8.1 標記枚舉的設計 92
4.8.2 給枚舉添加值 95
4.9 嵌套類型 97
4.10 類型和程序集元數據 98
4.11 小結 100
第5章 成員設計 101
5.1 成員設計的通用規範 101
5.1.1 成員重載 101
5.1.2 顯式地實現接口成員 107
5.1.3 屬性和方法之間的選擇 110
5.2 屬性的設計 115
5.2.1 索引屬性的設計 117
5.2.2 當屬性發生改變時的通知事件 119
5.3 構造函數的設計 121
5.4 事件的設計 128
5.5 字段的設計 134
5.6 擴展方法 136
5.7 操作符重載 142
5.7.1 重載operator== 146
5.7.2 類型轉換操作符 146
5.8 參數的設計 147
5.8.1 枚舉和布爾參數之間的選擇 149
5.8.2 參數的驗證 151
5.8.3 參數的傳遞 154
5.8.4 參數數量可變的成員 156
5.8.5 指針參數 159
5.9 小結 161
第6章 擴展性設計 162
6.1 擴展機製 162
6.1.1 非密封類 162
6.1.2 受保護的成員 164
6.1.3 事件與迴調函數 165
6.1.4 虛成員 169
6.1.5 抽象(抽象類型與抽象接口) 171
6.2 基類 173
6.3 密封 174
6.4 小結 177
第7章 異常 178
7.1 拋齣異常 182
7.2 為拋齣的異常選擇閤適的類型 187
7.2.1 錯誤消息的設計 190
7.2.2 異常處理 191
7.2.3 封裝異常 196
7.3 標準異常類型的使用 197
7.3.1 exception與systemexcep- tion 198
7.3.2 applicationexception 198
7.3.3 invalidoperationexception 198
7.3.4 argumentexception、argumentnullexception及argumentoutofrange-exception 199
7.3.5 nullreferenceexception、indexoutofrangeexception及accessviolationexception 199
7.3.6 stackoverflowexception 200
7.3.7 outofmemoryexception 201
7.3.8 comexception、sehexception以及executionengine-exception 202
7.4 自定義異常的設計 202
7.5 異常與性能 203
7.5.1 tester-doer模式 204
7.5.2 try-parse模式 205
7.6 小結 206
第8章 使用規範 207
8.1 數組 207
8.2 修飾屬性 208
8.3 集閤 211
8.3.1 集閤參數 213
8.3.2 集閤屬性與返迴值 214
8.3.3 數組與集閤之間的選擇 218
8.3.4 自定義集閤的實現 218
8.4 datetime和datetimeoffset 220
8.5 icloneable 222
8.6 icomparable[t]與iequatable[t] 223
8.7 idisposable 225
8.8 nullable[t] 225
8.9 object 226
8.9.1 object.equals 226
8.9.2 object.gethashcode 228
8.9.3 object.tostring 229
8.10 序列化 231
8.10.1 選擇要支持的序列化技術 232
8.10.2 對數據協定序列化的支持 233
8.10.3 對xml序列化的支持 237
8.10.4 對運行時序列化的支持 238
8.11 uri 239
8.12 system.xml的使用 241
8.13 相等性操作符 242
8.13.1 值類型的相等性操作符 243
8.13.2 引用類型的相等性操作符 243
第9章 常用的設計模式 244
9.1 聚閤組件 244
9.1.1 麵嚮組件的設計 245
9.1.2 因子類型 248
9.1.3 聚閤組件規範 249
9.2 async模式 251
9.2.1 選擇閤適的async模式 251
9.2.2 經典async模式 253
9.2.3 async模式的基本實現樣例 256
9.2.4 基於事件的async模式 257
9.2.5 對輸齣參數和引用參數的支持 259
9.2.6 對取消操作的支持 260
9.2.7 對進度報告的支持 260
9.2.8 對增量結果的支持 262
9.3 依賴屬性 263
9.3.1 依賴屬性的設計 264
9.3.2 附加依賴屬性的設計 266
9.3.3 依賴屬性的驗證 267
9.3.4 依賴屬性的改變通知 268
9.3.5 依賴屬性的強製賦值 269
9.4 dispose模式 269
9.4.1 基本dispose模式 272
9.4.2 可終結類型 277
9.5 factory模式 281
9.6 對linq的支持 285
9.6.1 linq概要 285
9.6.2 支持linq的幾種方法 286
9.6.3 通過ienumerable[t]來支持linq 287
9.6.4 通過iqueryable[t]來支持linq 287
9.6.5 通過query模式來支持linq 288
9.7 optional feature模式 291
9.8 simulated covariance模式 294
9.9 template method模式 299
9.10 超時 301
9.11 可供xaml使用的類型 303
9.12 結束語 305
附錄a c#編程風格約定 306
附錄b 通過fxcop來實施設計規範 313
附錄c api規格書樣例 343
術語錶 350
推薦讀物 354
索引 356
· · · · · · (
收起)