第I部分 CLR基礎
第1章 CLR的執行模型 3
1.1 將源代碼編譯成托管模塊 3
1.2 將托管模塊閤並成程序集 6
1.3 加載公共語言運行時 8
1.4 執行程序集的代碼 10
1.4.1 IL和驗證 15
1.4.2 不安全的代碼 16
1.5 本地代碼生成器:NGen.exe 18
1.6 Framework類庫 20
1.7 通用類型係統 22
1.8 公共語言規範 24
1.9 與非托管代碼的互操作性 28
第2章 生成、打包、部署和管理應用程序及類型 29
2.1 .NET Framework部署目標 29
2.2 將類型生成到模塊中 31響應文件 32
2.3 元數據概述 34
2.4 將模塊閤並成程序集 39
2.4.1 使用Visual Studio IDE將程序集添加到項目中 45
2.4.2 使用程序集鏈接器 46
.2.4.3 為程序集添加資源文件 48
2.5 程序集版本資源信息 49
2.6 語言文化 53
2.7 簡單應用程序部署(私有部署的程序集) 54
2.8 簡單管理控製(配置) 55
第3章 共享程序集和強命名程序集 59
3.1 兩種程序集,兩種部署 60
3.2 為程序集分配強名稱 61
3.3 全局程序集緩存 65
3.4 在生成的程序集中引用一個強命名程序集 67
3.5 強命名程序集能防範篡改 69
3.6 延遲簽名 70
3.7 私有部署強命名程序集 72
3.8 “運行時”如何解析類型引用 73
3.9 高級管理控製(配置) 76發布者策略控製 78
第II部分 設計類型
第4章 類型基礎 83
4.1 所有類型都從System.Object派生 83
4.2 類型轉換 85
4.3 命名空間和程序集 89
4.4 運行時的相互聯係 92
第5章 基元類型、引用類型和值類型 101
5.1 編程語言的基元類型 101
5.2 引用類型和值類型 108
5.3 值類型的裝箱和拆箱 113
5.3.1 使用接口更改已裝箱值類型中的字段(以及為什麼不應該這樣做) 124
5.3.2 對象相等性和同一性 127
5.4 對象哈希碼 129
5.5 dynamic基元類型 131
第6章 類型和成員基礎 137
6.1 類型的各種成員 137
6.2 類型的可見性 140友元程序集 140
6.3 成員的可訪問性 142
6.4 靜態類 143
6.5 分部類、結構和接口 145
6.6 組件、多態和版本控製 146
6.6.1 CLR如何調用虛方法、屬性和事件 148
6.6.2 閤理使用類型的可見性和成員的可訪問性 151
6.6.3 對類型進行版本控製時的虛方法的處理 154
第7章 常量和字段 159
7.1 常量 159
7.2 字段 160
第8章 方法 165
8.1 實例構造器和類(引用類型) 165
8.2 實例構造器和結構(值類型) 168
8.3 類型構造器 171
8.4 操作符重載方法 176
8.5 轉換操作符方法 179
8.6 擴展方法 182
8.6.1 規則和原則 184
8.6.2 用擴展方法擴展各種類型 185
8.6.3 ExtensionAttribute類 187
8.7 分部方法 188
第9章 參數 191
9.1 可選參數和命名參數 191
9.1.1 規則和原則 192
9.1.2 DefaultParameterValueAttribute和OptionalAttribute 194
9.2 隱式類型的局部變量 194
9.3 以傳引用的方式嚮方法傳遞參數 196
9.4 嚮方法傳遞可變數量的參數 201
9.5 參數和返迴類型的指導原則 203
9.6 常量性 205
第10章 屬性 207
10.1 無參屬性 207
10.1.1 自動實現的屬性 210
10.1.2 閤理定義屬性 211
10.1.3 對象和集閤初始化器 214
10.1.4 匿名類型 215
10.1.5 System.Tuple類型 218
10.2 有參屬性 220
10.3 調用屬性訪問器方法時的性能 225
10.4 屬性訪問器的可訪問性 225
10.5 泛型屬性訪問器方法 225
第11章 事件 227
11.1 設計要公開事件的類型 228
11.1.1 第一步:定義類型來容納所有需要發送給事件通知接收者的附加信息 229
11.1.2 第二步:定義事件成員 229
11.1.3 第三步:定義負責引發事件的方法來通知事件的登記對象 231
11.1.4 第四步:定義方法將輸入轉化為期望事件 233
11.2 編譯器如何實現事件 233
11.3 設計偵聽事件的類型 235
11.4 顯式實現事件 237
第12章 泛型 241
12.1 Framework類庫中的泛型 245
12.2 Wintellect的Power Collections庫 246
12.3 泛型基礎結構 247
12.3.1 開放類型和封閉類型 247
12.3.2 泛型類型和繼承 249
12.3.3 泛型類型同一性 251
12.3.4 代碼爆炸 252
12.4 泛型接口 252
12.5 泛型委托 253
12.6 委托和接口的逆變和協變泛型類型實參 254
12.7 泛型方法 256
12.8 泛型和其他成員 258
12.9 可驗證性和約束 259
12.9.1 主要約束 261
12.9.2 次要約束 262
12.9.3 構造器約束 263
12.9.4 其他可驗證性問題 264
第Ⅲ部分 基本類型
第13章 接口 267
13.1 類和接口繼承 267
13.2 定義接口 268
13.3 繼承接口 269
13.4 關於調用接口方法的更多探討 271
13.5 隱式和顯式接口方法實現(幕後發生的事情) 272
13.6 泛型接口 274
13.7 泛型和接口約束 276
13.8 實現多個具有相同方法名和簽名的接口 277
13.9 用顯式接口方法實現來增強編譯時類型安全性 278
13.10 謹慎使用顯式接口方法實現 280
13.11 設計:基類還是接口 282
第14章 字符、字符串和文本處理 287
14.1 字符 287
14.2 System.String類型 290
14.2.1 構造字符串 290
14.2.2 字符串是不可變的 292
14.2.3 比較字符串 293
14.2.4 字符串留用 298
14.2.5 字符串池 301
14.2.6 檢查字符串中的字符和文本元素 301
14.2.7 其他字符串操作 303
14.3 高效率構造字符串 304
14.3.1 構造StringBuilder對象 304
14.3.2 StringBuilder的成員 305
14.4 獲取對象的字符串錶示:ToString 307
14.4.1 指定具體的格式和語言文化 308
14.4.2 將多個對象格式成一個字符串 311
14.4.3 提供定製格式化器 313
14.5 解析字符串來獲取對象:Parse 315
14.6 編碼:字符和字節的相互轉換 317
14.6.1 字符和字節流的編碼和解碼 322
14.6.2 Base-64字符串編碼和解碼 323
14.7 安全字符串 324
第15章 枚舉類型和位標誌 327
15.1 枚舉類型 327
15.2 位標誌 332
15.3 嚮枚舉類型添加方法 335
第16章 數組 337
16.1 初始化數組元素 339
16.2 數組轉型 341
16.3 所有數組都隱式派生自System.Array 343
16.4 所有數組都隱式實現IEnumerable,Icollection和IList 344
16.5 數組的傳遞和返迴 345
16.6 創建下限非零的數組 346
16.7 數組的訪問性能 347
16.8 不安全的數組訪問和固定大小的數組 351
第17章 委托 353
17.1 初識委托 353
17.2 用委托迴調靜態方法 355
17.3 用委托迴調實例方法 357
17.4 委托揭秘 357
17.5 用委托迴調許多方法(委托鏈) 361
17.5.1 C#對委托鏈的支持 365
17.5.2 取得對委托鏈調用的更多控製 365
17.6 委托定義太多(泛型委托) 368
17.7 C#為委托提供的簡化語法 369
17.7.1 簡化語法1:不需要構造委托對象 369
17.7.2 簡化語法2:不需要定義迴調方法 370
17.7.3 簡化語法3:局部變量不需要手動包裝到類中即可傳給迴調方法 373
17.8 委托和反射 375
第18章 定製attribute 379
18.1 使用定製attribute 379
18.2 定義自己的attribute類 382
18.3 attribute的構造器和字段/屬性的數據類型 386
18.4 檢測定製attribute 387
18.5 兩個attribute實例的相互匹配 391
18.6 檢測定製attribute時不創建從Attribute派生的對象 393
18.7 條件attribute類 396
第19章 可空值類型 399
19.1 C#對可空值類型的支持 401
19.2 C#的空接閤操作符 403
19.3 CLR對可空值類型的特殊支持 404
19.3.1 可空值類型的裝箱 404
19.3.2 可空值類型的拆箱 405
19.3.3 通過可空值類型調用GetType 405
19.3.4 通過可空值類型調用接口方法 405
第Ⅳ部分 核心機製
第20章 異常和狀態管理 409
20.1 定義“異常” 409
20.2 異常處理機製 411
20.2.1 try塊 412
20.2.2 catch塊 412
20.2.3 finally塊 414
20.3 System.Exception類 417
20.4 FCL定義的異常類 420
20.5 拋齣異常 422
20.6 定義自己的異常類 423
20.7 用可靠性換取開發效率 425
20.8 指導原則和最佳實踐 433
20.8.1 善用finally塊 433
20.8.2 不要什麼都捕捉 435
20.8.3 得體地從異常中恢復 436
20.8.4 發生不可恢復的異常時迴滾部分完成的操作——維持狀態 436
20.8.5 隱藏實現細節來維係契約 437
20.9 未處理的異常 440
20.10 對異常進行調試 444
20.11 異常處理的性能問題 446
20.12 約束執行區域(CER) 448
20.13 代碼契約 451
第21章 自動內存管理(垃圾迴收) 459
21.1 理解垃圾迴收平颱的基本工作原理 459
21.2 垃圾迴收算法 463
21.3 垃圾迴收與調試 466
21.4 使用終結操作來釋放本地資源 469
21.4.1 使用CriticalFinalizerObject類型確保終結 470
21.4.2 SafeHandle類型及其派生類型 471
21.4.3 使用SafeHandle類型與非托管代碼進行互操作 473
21.5 對托管資源使用終結操作 475
21.6 什麼會導緻Finalize方法被調用 477
21.7 終結操作揭秘 478
21.8 Dispose模式:強製對象清理資源 481
21.9 使用實現瞭Dispose模式的類型 485
21.10 C#的using語句 488
21.11 一個有趣的依賴性問題 490
21.12 手動監視和控製對象的生存期 491
21.13 對象復活 501
21.14 代 503
21.15 用於本地資源的其他垃圾迴收功能 508
21.16 預測需求大量內存的操作能否成功 512
21.17 編程控製垃圾迴收器 513
21.18 綫程劫持 516
21.19 垃圾迴收模式 517
21.20 大對象 520
21.21 監視垃圾迴收 520
第22章 CLR寄宿和AppDomain 523
22.1 CLR寄宿 523
22.2 AppDomain 526
22.3 卸載AppDomain 538
22.4 監視AppDomain 540
22.5 AppDomain FirstChance異常通知 541
22.6 宿主如何使用AppDomain 541
22.6.1 可執行應用程序 542
22.6.2 Microsoft Silverlight富Internet應用程序 542
22.6.3 Microsoft ASP.NET Web窗體和XML Web服務應用程序 542
22.6.4 Microsoft SQL Server 543
22.6.5 更多的用法隻局限於你自己的想象力 543
22.7 高級宿主控製 544
22.7.1 使用托管代碼管理CLR 544
22.7.2 編寫健壯的宿主應用程序 544
22.7.3 宿主如何拿迴它的綫程 546
第23章 程序集加載和反射 549
23.1 程序集加載 549
23.2 使用反射構建動態可擴展應用程序 554
23.3 反射的性能 555
23.3.1 發現程序集中定義的類型 556
23.3.2 類型對象的準確含義 556
23.3.3 構建Exception派生類型的一個層次結構 558
23.3.4 構造類型的實例 560
23.4 設計支持加載項的應用程序 562
23.5 使用反射發現類型的成員 564
23.5.1 發現類型成員 565
23.5.2 BindingFlags:篩選返迴的成員種類 569
23.5.3 發現類型的接口 570
23.5.4 調用類型的成員 571
23.5.5 一次綁定,多次調用 575
23.5.6 使用綁定句柄來減少進程的內存耗用 581
第24章 運行時序列化 585
24.1 序列化/反序列化快速入門 586
24.2 使類型可序列化 590
24.3 控製序列化和反序列化 592
24.4 格式化器如何序列化類型實例 595
24.5 控製序列化/反序列化的數據 597
24.6 流上下文 603
24.7 將類型序列化為不同的類型以及將對象反序列化為不同的對象 604
24.8 序列化代理 606
代理選擇器鏈 609
24.9 反序列化對象時重寫程序集和/或類型 610
第Ⅴ部分 綫程處理
第25章 綫程基礎 615
25.1 Windows為什麼要支持綫程 615
25.2 綫程開銷 616
25.3 停止瘋狂 620
25.4 CPU發展趨勢 622
25.5 NUMA架構的機器 623
25.6 CLR綫程和Windows綫程 625
25.7 使用專用綫程執行異步的計算限製操作 625
25.8 使用綫程的理由 627
25.9 綫程調度和優先級 629
25.10 前颱綫程和後颱綫程 634
25.11 繼續學習 635
第26章 計算限製的異步操作 637
26.1 CLR綫程池基礎 638
26.2 執行簡單的計算限製操作 639
26.3 執行上下文 640
26.4 協作式取消 642
26.5 任務 645
26.5.1 等待任務完成並獲取它的結果 646
26.5.2 取消任務 648
26.5.3 一個任務完成時自動啓動一個新任務 649
26.5.4 任務可以啓動子任務 651
26.5.5 任務內部揭秘 652
26.5.6 任務工廠 653
26.5.7 任務調度器 655
26.6 Parallel的靜態For,ForEach和Invoke方法 657
26.7 並行語言集成查詢(PLINQ) 660
26.8 執行定時計算限製操作 663
26.9 綫程池如何管理綫程 665
26.9.1 設置綫程池限製 665
26.9.2 如何管理工作者綫程 666
26.10 緩存綫和僞共享 667
第27章 I/O限製的異步操作 671
27.1 Windows如何執行I/O操作 671
27.2 CLR的異步編程模型(APM) 675
27.3 AsyncEnumerator類 679
27.4 APM和異常 682
27.5 應用程序及其綫程處理模型 683
27.6 異步實現服務器 687
27.7 APM和計算限製的操作 687
27.8 APM的注意事項 689
27.8.1 在沒有綫程池的前提下使用APM 689
27.8.2 總是調用EndXxx方法,而且隻調用一次 690
27.8.3 調用EndXxx方法時總是使用相同的對象 690
27.8.4 為BeginXxx和EndXxx方法使用ref,out和params實參 691
27.8.5 不能取消異步I/O限製操作 691
27.8.6 內存消耗 691
27.8.7 有的I/O操作必須同步完成 691
27.8.8 FileStream特有的問題 692
27.9 I/O請求優先級 693
27.10 將IAsyncResult APM轉換為Task 695
27.11 基於事件的異步模式 696
27.11.1 將EAP轉換為Task 698
27.11.2 APM和EAP的對比 699
27.12 編程模型的泥沼 700
第28章 基元綫程同步構造 703
28.1 類庫和綫程安全 705
28.2 基元用戶模式和內核模式構造 706
28.3 用戶模式構造 707
28.3.1 易失構造 708
28.3.2 互鎖構造 713
28.3.3 實現簡單的Spin Lock 717
28.3.4 Interlocked Anything模式 720
28.4 內核模式構造 722
28.4.1 Event構造 725
28.4.2 Semaphore構造 727
28.4.3 Mutex構造 728
28.4.4 在一個內核構造可用時調用一個方法 730
第29章 混閤綫程同步構造 733
29.1 一個簡單的混閤鎖 733
29.2 自鏇、綫程所有權和遞歸 735
29.3 混閤構造的大雜燴 737
29.3.1 ManualResetEventSlim類和SemaphoreSlim類 737
29.3.2 Monitor類和同步塊 738
29.3.3 ReaderWriterLockSlim類 743
29.3.4 OneManyLock類 745
29.3.5 CountdownEvent類 747
29.3.6 Barrier類 747
29.3.7 綫程同步構造小結 748
29.4 著名的雙檢鎖技術 750
29.5 條件變量模式 754
29.6 用集閤防止占有鎖太長的時間 756
29.7 並發集閤類 760
· · · · · · (
收起)