內容簡介
這是C#領域中一部廣受好評的名作,作者用一種易於理解的方式詳細介紹了C#語言的各個方面。《C#本質論(第4版)》共有21章和4個附錄,介紹了C#語言的數據類型、操作符、方法、類、接口、異常處理等基本概念,深入討論了泛型、疊代器、反射、執行緒和互操作性等高級主題,還介紹了LINQ技術,以及與其相關的擴展方法、分部方法、Lambda表達式、標準查詢操作符和查詢表達式等內容。每章開頭的“思維導圖”指明本章要討論的主題,以及各個主題之間的層次關係。為了幫助讀者理解各種C#構造,書中用豐富的示例演示每一種特性,而且為每個概念都提供了相應的規範和實踐,以確保代碼能順利編譯、避免留下隱患,並獲得可維護性。
《C#本質論(第4版)》是一本語言參考書,遵循核心C# 5.0語言規範,適合對C#感興趣的各個層次的讀者。無論對初學者還是具有一定編程經驗的開發者,《C#本質論(第4版)》都是一本很有價值的參考書。
圖書目錄
第1章 C#概述 1
1.1 Hello,World 1
1.2 C#語法基礎 3
1.2.1 C#關鍵字 3
1.2.2 標識符 4
1.2.3 類型定義 5
1.2.4 Main 6
1.2.5 語句和語句分隔設定 7
1.2.6 空白 8
1.2.7 使用變數 8
1.2.8 數據類型 9
1.2.9 變數的聲明 9
1.2.10 變數的賦值 10
1.2.11 變數的使用 11
1.3 控制台輸入和輸出 11
1.3.1 從控制台獲取輸入 11
1.3.2 將輸出寫入控制台 12
1.3.3 注釋 14
1.3.4 託管執行和公共語言基礎結構 16
1.3.5 C#和.NET版本 17
1.3.6 CIL和ILDASM 18
1.4 小結 20
第 2章 數據類型 21
2.1 基本數值類型 21
2.1.1 整數類型 22
2.1.2 浮點類型 23
2.1.3 decimal類型 23
2.1.4 字面值 24
2.2 更多基本類型 27
2.2.1 布爾類型 27
2.2.2 字元類型 27
2.2.3 字元串 29
2.3 null和void 34
2.3.1 null 34
2.3.2 void 35
2.4 類型的分類 37
2.4.1 值類型 37
2.4.2 引用類型 37
2.5 可空修飾符 38
2.6 數據類型之間的轉換 39
2.6.1 顯式轉型 39
2.6.2 隱式轉型 41
2.6.3 不使用轉型操作符的類型轉換 42
2.7 數組 43
2.7.1 數組的聲明 44
2.7.2 數組的實例化和賦值 45
2.7.3 數組的使用 48
2.7.4 字元串作為數組使用 52
2.7.5 常見數組錯誤 53
2.8 小結 55
第3章 操作符和控制流 57
3.1 操作符 57
3.1.1 一元操作符正和負 58
3.1.2 二元算術操作符 58
3.1.3 複合賦值操作符 64
3.1.4 遞增和遞減操作符 65
3.1.5 常量表達式和常量符號 68
3.2 控制流程概述 69
3.2.1 if語句 70
3.2.2 嵌套if 71
3.3 代碼塊 73
3.4 代碼塊、作用域和聲明空間 74
3.5 布爾表達式 76
3.5.1 關係操作符和相等性操作符 77
3.5.2 邏輯布爾操作符 77
3.5.3 邏輯求反操作符 78
3.5.4 條件操作符 79
3.5.5 空接合操作符 80
3.6 按位操作符 80
3.6.1 移位操作符 81
3.6.2 按位操作符 82
3.6.3 按位賦值操作符 83
3.6.4 按位取反操作符 84
3.7 控制流語句(續) 84
3.7.1 while和do while循環 84
3.7.2 for循環 86
3.7.3 foreach循環 88
3.7.4 switch語句 90
3.8 跳轉語句 92
3.8.1 break語句 92
3.8.2 continue語句 94
3.8.3 goto語句 95
3.9 C#預處理指令 97
3.9.1 排除和包含代碼 98
3.9.2 定義預處理符號 98
3.9.3 生成錯誤和警告 99
3.9.4 關閉警告訊息 99
3.9.5 nowarn:選項 99
3.9.6 指定行號 100
3.9.7 可視編輯器提示 100
3.10 小結 101
第4章 方法和參數 103
4.1 方法的調用 104
4.1.1 命名空間 105
4.1.2 類型名稱 106
4.1.3 作用域 107
4.1.4 方法名稱 107
4.1.5 形參和實參 107
4.1.6 方法返回值 107
4.1.7 語句與方法調用的比較 108
4.2 方法的聲明 108
4.2.1 形式參數聲明 109
4.2.2 方法返回類型聲明 110
4.3 using指令 111
4.4 Main的返回值和參數 114
4.5 方法的參數 116
4.5.1 值參數 116
4.5.2 引用參數(ref) 117
4.5.3 輸出參數(out) 118
4.5.4 參數數組 120
4.6 遞歸 122
4.7 方法重載 124
4.8 可選參數 126
4.9 用異常實現基本錯誤處理 129
4.9.1 捕捉錯誤 130
4.9.2 使用throw語句報告錯誤 136
4.10 小結 138
第5章 類 139
5.1 類的定義和實例化 141
5.2 實例欄位 144
5.2.1 實例欄位的聲明 144
5.2.2 實例欄位的訪問 144
5.3 實例方法 145
5.4 使用this關鍵字 146
5.5 訪問修飾符 151
5.6 屬性 153
5.6.1 屬性的聲明 154
5.6.2 自動實現的屬性 155
5.6.3 屬性和欄位的設計編碼規範 157
5.6.4 提供屬性驗證 157
5.6.5 唯讀和只寫屬性 159
5.6.6 為取值方法和賦值方法指定訪問修飾符 160
5.6.7 屬性作為虛欄位使用 161
5.6.8 屬性和方法調用不允許作為ref或out參數值使用 163
5.7 構造器 164
5.7.1 構造器的聲明 164
5.7.2 默認構造器 165
5.7.3 對象初始化器 166
5.7.4 構造器的重載 167
5.7.5 構造器鏈:使用this調用另一個構造器 168
5.8 靜態成員 172
5.8.1 靜態欄位 172
5.8.2 靜態方法 174
5.8.3 靜態構造器 175
5.8.4 靜態屬性 176
5.8.5 靜態類 177
5.9 擴展方法 178
5.10 封裝數據 179
5.10.1 const 179
5.10.2 readonly 180
5.11 嵌套類 181
5.12 分部類 183
5.12.1 定義分部類 183
5.12.2 分部方法 184
5.13 小結 186
第6章 繼承 187
6.1 派生 188
6.1.1 基類型和派生類型之間的轉型 190
6.1.2 private訪問修飾符 191
6.1.3 protected訪問修飾符 192
6.1.4 擴展方法 193
6.1.5 單繼承 194
6.1.6 密封類 195
6.2 基類的重寫 196
6.2.1 virtual修飾符 196
6.2.2 new修飾符 199
6.2.3 sealed修飾符 202
6.2.4 base成員 203
6.2.5 構造器 204
6.3 抽象類 204
6.4 所有類都從System.Object派生 208
6.5 使用is操作符驗證基礎類型 209
6.6 使用as操作符進行轉換 210
6.7 小結 211
第7章 接口 213
7.1 接口概述 213
7.2 通過接口實現多態性 215
7.3 接口實現 218
7.3.1 顯式成員實現 220
7.3.2 隱式成員實現 221
7.3.3 顯式接口實現與隱式接口實現的比較 221
7.4 在實現類和接口之間轉換 222
7.5 接口繼承 222
7.6 多接口繼承 224
7.7 接口上的擴展方法 225
7.8 通過接口實現多繼承 226
7.9 版本控制 228
7.10 接口與類的比較 229
7.11 接口與特性的比較 230
7.12 小結 230
第8章 值類型 231
8.1 結構 231
8.1.1 結構的初始化 235
8.1.2 default操作符的使用 237
8.1.3 值類型的繼承和接口 237
8.2 裝箱 238
8.3 枚舉 243
8.3.1 枚舉之間的類型兼容性 246
8.3.2 枚舉和字元串之間的轉換 246
8.3.3 枚舉作為標誌使用 248
8.4 小結 251
第9章 良構類型 253
9.1 重寫object的成員 253
9.1.1 重寫ToString 253
9.1.2 重寫GetHashCode 254
9.1.3 重寫Equals 256
9.2 操作符重載 263
9.2.1 比較操作符 264
9.2.2 二元操作符 265
9.2.3 賦值與二元操作符的結合 266
9.2.4 條件邏輯操作符 266
9.2.5 一元操作符 267
9.2.6 轉換操作符 268
9.2.7 轉換操作符的規範 269
9.3 引用其他程式集 269
9.3.1 更改程式集目標 270
9.3.2 引用程式集 270
9.3.3 類型封裝 271
9.4 定義命名空間 272
9.5 XML注釋 275
9.5.1 將XML注釋與代碼構造關聯到一起 275
9.5.2 生成XML文檔檔案 277
9.6 垃圾回收 278
9.7 資源清理 280
9.7.1 終結器 280
9.7.2 使用using語句進行確定性終結 282
9.7.3 垃圾回收、終結和IDisposable 284
9.8 推遲初始化 286
9.9 小結 288
第 10章 異常處理 289
10.1 多異常類型 289
10.2 捕捉異常 291
10.3 常規catch塊 293
10.4 異常處理的規範 295
10.5 定義自定義異常 297
10.6 封裝異常並重新引發 299
10.7 小結 302
第 11章 泛型 303
11.1 如果C# 沒有泛型 303
11.2 泛型類型概述 307
11.2.1 泛型類的使用 308
11.2.2 簡單泛型類的定義 309
11.2.3 泛型的優點 310
11.2.4 類型參數命名規範 310
11.2.5 泛型接口和結構 311
11.2.6 構造器和終結器的定義 313
11.2.7 默認值的指定 313
11.2.8 多個類型參數 314
11.2.9 元數 315
11.2.10 嵌套泛型類型 316
11.3 約束 317
11.3.1 接口約束 319
11.3.2 類類型約束 320
11.3.3 struct class約束 321
11.3.4 多個約束 321
11.3.5 構造器約束 322
11.3.6 約束繼承 323
11.4 泛型方法 327
11.4.1 泛型方法類型推斷 328
11.4.2 約束的指定 328
11.5 協變性和逆變性 330
11.5.1 在C# 4.0中使用out類型參數修飾符允許協變性 331
11.5.2 在C# 4.0中使用in類型參數修飾符允許逆變性 332
11.5.3 數組對不安全協變性的支持 335
11.6 泛型的內部機制 335
11.6.1 基於值類型的泛型的實例化 336
11.6.2 基於引用類型的泛型的實例化 337
11.7 小結 338
第 12章 委託和Lambda表達式 339
12.1 委託概述 340
12.1.1 背景 340
12.1.2 委託數據類型 341
12.1.3 委託類型的聲明 342
12.1.4 委託的實例化 343
12.2 Lambda表達式 347
12.2.1 語句Lambda 347
12.2.2 表達式Lambda 349
12.3 匿名方法 351
12.4 通用的委託:System.Func和System.Action 352
12.4.1 委託沒有結構相等性 353
12.4.2 外部變數 355
12.4.3 表達式樹 359
12.5 小結 364
第 13章 事件 365
13.1 使用多播委託來編碼Observer模式 366
13.1.1 定義訂閱者方法 366
13.1.2 定義發布者 367
13.1.3 連線發布者和訂閱者 368
13.1.4 調用委託 368
13.1.5 檢查null值 369
13.1.6 委託操作符 370
13.1.7 順序調用 371
13.1.8 錯誤處理 374
13.1.9 方法返回值和傳引用 376
13.2 事件 376
13.2.1 事件的作用 376
13.2.2 事件的聲明 378
13.2.3 編碼規範 379
13.2.4 泛型和委託 380
13.2.5 自定義事件的實現 383
13.3 小結 384
第 14章 支持標準查詢操作符的集合接口 385
14.1 匿名類型和隱式類型的局部變數聲明 386
14.1.1 匿名類型 386
14.1.2 隱式類型的局部變數 387
14.1.3 匿名類型和隱式局部變數的更多注意事項 388
14.2 集合初始化器 390
14.3 是什麼使類成為集合:IEnumerable 392
14.3.1 foreach和數組 392
14.3.2 foreach和IEnumerable 393
14.3.3 foreach循環內不要修改集合 396
14.4 標準查詢操作符 397
14.4.1 使用Where來篩選 400
14.4.2 使用Select來投射 401
14.4.3 使用Count對元素進行計數 403
14.4.4 推遲執行 404
14.4.5 使用OrderBy和ThenBy來排序 408
14.4.6 使用Join來執行內部聯接 412
14.4.7 使用GroupBy分組結果 415
14.4.8 使用GroupJoin實現一對多關係 416
14.4.9 調用Selectmany 418
14.4.10 更多標準查詢操作符 420
14.5 小結 423
第 15章 使用查詢表達式的LINQ 425
15.1 查詢表達式概述 426
15.1.1 投射 427
15.1.2 篩選 432
15.1.3 排序 433
15.1.4 let子句 434
15.1.5 分組 435
15.1.6 使用into進行查詢延續 437
15.1.7 用多個from子句“平整”序列的序列 438
15.2 查詢表達式作為方法調用 439
15.3 小結 440
第 16章 構建自定義集合 441
16.1 更多集合接口 442
16.1.1 IList與IDictionary 442
16.1.2 ICollection 443
16.2 主要集合類 443
16.2.1 列表集合:List 443
16.2.2 全序 446
16.2.3 搜尋List 447
16.2.4 字典集合:Dictionary 449
16.2.5 已排序集合:SortedDictionary和SortedList 453
16.2.6 棧集合:Stack 454
16.2.7 佇列集合:Queue 455
16.2.8 鍊表:LinkedList 456
16.3 提供索引器 456
16.4 返回null或者空集合 459
16.5 疊代器 459
16.5.1 疊代器的定義 460
16.5.2 疊代器語法 460
16.5.3 從疊代器生成值 461
16.5.4 疊代器和狀態 463
16.5.5 更多的疊代器例子 464
16.5.6 將yield return語句放到循環中 465
16.5.7 取消更多的疊代:yield break 467
16.5.8 在單個類中創建多個疊代器 469
16.5.9 yield語句的要求 470
16.6 小結 470
第 17章 反射、特性和動態編程 471
17.1 反射 471
17.1.1 使用System.Type訪問元數據 472
17.1.2 成員調用 473
17.1.3 泛型類型上的反射 478
17.2 特性 479
17.2.1 自定義特性 482
17.2.2 查找特性 483
17.2.3 使用構造器來初始化特性 484
17.2.4 System.AttributeUsage-Attribute 488
17.2.5 命名參數 488
17.3 使用動態對象進行編程 498
17.3.1 使用dynamic調用反射 499
17.3.2 dynamic的原則和行為 500
17.3.3 為什麼需要動態綁定 501
17.3.4 靜態編譯與動態編程的比較 502
17.3.5 實現自定義動態對象 503
17.4 小結 505
第 18章 多執行緒處理 507
18.1 多執行緒基礎 509
18.2 使用System.Threading 512
18.2.1 使用System.Threading.Thread進行異步操作 512
18.2.2 執行緒管理 514
18.2.3 在生產代碼中不要讓執行緒進入睡眠 514
18.2.4 在生產代碼中不要中止執行緒 515
18.2.5 執行緒池處理 516
18.3 異步任務 517
18.3.1 從Thread到Task 518
18.3.2 理解異步任務 518
18.3.3 任務延續 521
18.3.4 用AggregateException處理Task上的未處理異常 525
18.4 取消任務 530
18.4.1 Task.Run是Task.Factory.StartNew的簡化形式 532
18.4.2 長時間運行的任務 532
18.4.3 對任務進行資源清理 533
18.5 C# 5.0基於任務的異步模式 533
18.5.1 以同步方式調用高延遲操作 534
18.5.2 使用TPL異步調用高延遲操作 535
18.5.3 通過async和await實現基於任務的異步模式 538
18.5.4 異步Lambda 541
18.5.5 任務調度器和同步上下文 546
18.5.6 async await和Windows UI 547
18.5.7 await操作符 548
18.6 並行疊代 549
18.7 並行執行LINQ查詢 556
18.8 小結 560
第 19章 執行緒同步 561
19.1 為什麼要同步 562
19.1.1 使用Monitor來同步 565
19.1.2 使用lock關鍵字 567
19.1.3 lock對象的選擇 568
19.1.4 為什麼要避免鎖定this、typeof(type)和string 569
19.1.5 將欄位聲明為volatile 570
19.1.6 使用System.Threading.Interlocked類 570
19.1.7 多個執行緒時的事件通知 571
19.1.8 同步設計**佳實踐 572
19.1.9 更多的同步類型 573
19.1.10 執行緒本地存儲 580
19.2 計時器 583
19.3 小結 584
第 20章 平台互操作性和不安全的代碼 585
20.1 在C#中使用WinRT庫 586
20.1.1 具有自定義Add Remove處理程式的WinRT事件 586
20.1.2 自動變換的接口 587
20.1.3 基於任務的異步 587
20.2 平台調用 588
20.2.1 外部函式的聲明 588
20.2.2 參數的數據類型 588
20.2.3 使用ref而不是指針 590
20.2.4 為順序布局使用StructLayoutAttribute 590
20.2.5 錯誤處理 591
20.2.6 使用SafeHandle 593
20.2.7 外部函式的調用 595
20.2.8 用包裝器簡化API調用 597
20.2.9 函式指針映射到委託 598
20.2.10 編碼規範 598
20.3 指針和地址 598
20.3.1 不安全的代碼 598
20.3.2 指針的聲明 599
20.3.3 指針的賦值 600
20.3.4 指針的解引用 602
20.3.5 訪問被引用物類型的成員 604
20.3.6 通過委託執行不安全的代碼 604
20.4 小結 606
第 21章 CLI 607
21.1 CLI的定義 607
21.2 CLI實現 608
21.3 C#編譯成機器碼 609
21.4 運行時 611
21.4.1 垃圾回收 611
21.4.2 .NET的垃圾回收 611
21.4.3 類型安全 612
21.4.4 代碼訪問安全性 612
21.4.5 平台可移植性 612
21.4.6 性能 613
21.5 應用程式域 614
21.6 程式集、清單和模組 614
21.7 公共中間語言 616
21.8 公共類型系統 616
21.9 公共語言規範 617
21.10 基類庫 617
21.11 元數據 617
21.12 小結 618
附錄A 下載和安裝C#編譯器與CLI平台 619
附錄B 井字棋原始碼清單 621
附錄C TPL和C# 5.0之前的多執行緒模式 627
附錄D C# 5.0 async await模式之前的計時器 649