第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