C# 12.0本質論 Essential C# 12.0

[美] 馬克·米凱利斯(Mark Michaelis)著 周靖 譯

  • 出版商: 清華大學
  • 出版日期: 2024-08-01
  • 定價: $1,194
  • 售價: 8.5$1,015
  • 語言: 簡體中文
  • ISBN: 7302668043
  • ISBN-13: 9787302668046
  • 相關分類: C#
  • 此書翻譯自: Essential C# 12.0 (Paperback)
  • 下單後立即進貨 (約4週~6週)

  • C# 12.0本質論-preview-1
  • C# 12.0本質論-preview-2
  • C# 12.0本質論-preview-3
C# 12.0本質論-preview-1

買這商品的人也買了...

商品描述

"《C# 12.0本質論(第8版)》是C#領域中廣受好評的經典著作。作為C#**指南,本書深入解析了C# 12.0的類型別名、內聯數組、默認Lambda表達式參數以及對許多主要語言構造的擴展支持。全書共24章,每章開頭用“思維導圖”指明要討論的主題以及每個主題與整體的關系。在介紹相關知識點的同時結合了大量通俗易懂的實例,旨在幫助讀者全面掌握C#語言,快速成為C#高級程序員。 《C# 12.0本質論(第8版)》適用於對C#感興趣的各種層次的讀者,無論是初學者還是資源開發人員,都可以從本書中獲益。 "

目錄大綱

詳 細 目 錄

第1章 C#概述 001

1.1 Hello, World 002

1.1.1 創建、編輯、編譯和運行C#源代碼 002

1.1.2 理解項目 006

1.1.3 編譯和執行 007

1.1.4 使用本書源代碼 008

1.2 C#語法基礎 008

1.2.1 語句和語句定界符 008

1.2.2 認識類和方法 009

1.2.3 C#語言的關鍵字 010

1.2.4 標識符 011

1.2.5 類型定義 013

1.2.6 Main方法 014

1.2.7 空白 015

1.3 使用變量 016

1.3.1 數據類型 016

1.3.2 變量聲明 017

1.3.3 變量賦值 017

1.3.4 使用變量 018

1.4 控制台輸入和輸出 019

1.4.1 從控制台獲取輸入 019

1.4.2 將輸出寫入控制台 020

1.4.3 註釋 022

1.4.4 調試 024

1.5 托管執行和CLI  025

1.6 多個.NET框架 029

1.6.1 應用程序編程接口 030

1.6.2 C#和.NET版本控制 030

1.7 小結 032

第2章 數據類型 033

2.1 類型名稱形式 033

2.2 基本數值類型 035

2.2.1 整數類型 035

2.2.2 浮點類型 036

2.2.3 decimal類型 037

2.2.4 字面值 038

2.3 更多基元類型 042

2.3.1 布爾類型bool 042

2.3.2 字符類型char 043

2.3.3 字符串string 044

2.3.4 關鍵字null和void 055

2.4 數據類型轉換 056

2.4.1 顯式轉型 057

2.4.2 隱式轉型 058

2.4.3 不使用轉型操作符的類型轉換 059

2.5 小結 061

第3章 深入數據類型 062

3.1 類型的劃分 062

3.1.1 值類型 062

3.1.2 引用類型 063

3.2  聲明允許為null的類型 064

3.2.1 對null引用進行解引用 064

3.2.2 可空值類型 065

3.2.3 可空引用類型 066

3.3  隱式類型的局部變量 067

3.4 元組 068

3.5 數組 073

3.5.1 數組聲明 075

3.5.2 數組實例化和賦值 076

3.5.3 使用數組 079

3.5.4 範圍 083

3.5.5 更多數組方法 084

3.5.6 數組的實例成員 085

3.5.7 字符串作為數組 086

3.5.8 常見數組錯誤 088

3.6 小結 089

第4章 操作符和控制流 090

4.1 操作符 091

4.1.1 一元正負操作符 091

4.1.2 二元算術操作符 092

4.1.3 復合賦值操作符 097

4.1.4 遞增和遞減操作符 098

4.1.5 常量表達式和常量符號 101

4.2 控制流概述 102

4.2.1 if語句 104

4.2.2 嵌套if 104

4.3 代碼塊({}) 106

4.4 代碼塊、作用域和聲明空間 107

4.5 布爾表達式 109

4.5.1 關系操作符和相等性操作符 109

4.5.2 邏輯操作符 110

4.5.3 邏輯取反操作符! 112

4.5.4 條件操作符?: 112

4.6 用null編程 113

4.6.1 檢查是否為null 113

4.6.2 空合並操作符??和空合並賦值操作符??= 115

4.6.3 空條件操作符?. 116

4.6.4 空包容操作符! 117

4.7 按位操作符 119

4.7.1 移位操作符 120

4.7.2 按位操作符 120

4.7.3 按位復合賦值操作符 122

4.7.4 按位取反操作符 123

4.8 再論控制流語句 123

4.8.1 while循環和do/while循環 123

4.8.2 for循環 125

4.8.3 foreach循環 127

4.8.4 基本switch語句 129

4.9 跳轉語句 132

4.9.1 break語句 132

4.9.2 continue語句 133

4.9.3 goto語句 135

4.10 C#預處理器指令 136

4.10.1 排除和包含代碼 137

4.10.2 定義預處理器符號 138

4.10.3 生成錯誤#error和警告#warning 139

4.10.4 關閉警告消息#pragma 139

4.10.5 nowarn:<warn list>選項 140

4.10.6 指定行號#line 140

4.10.7 可視編輯器提示#region和#endregion 141

4.11 小結 142

第5章 參數和方法 144

5.1 調用方法 145

5.1.1 命名空間 146

5.1.2 類型名稱 148

5.1.3 作用域 148

5.1.4 方法名稱 148

5.1.5 形參和實參 148

5.1.6 方法返回值 148

5.1.7 對比語句和方法調用 149

5.2 聲明方法 149

5.2.1 參數聲明 151

5.2.2 方法返回類型聲明 151

5.2.3 表達式主體方法 153

5.2.4 本地函數 154

5.3 using指令 154

5.3.1 using指令概述 155

5.3.2 隱式using指令 156

5.3.3 全局using指令 157

5.3.4 .csproj Using元素 158

5.3.5 using static指令  159

5.3.6 使用別名 160

5.4 Main()方法的返回值和參數 161

5.5 頂級語句 163

5.6 高級方法參數 164

5.6.1 值參數 164

5.6.2 引用參數ref 166

5.6.3 輸出參數out 167

5.6.4 只讀傳引用 169

5.6.5 返回引用 169

5.6.6 參數數組(params) 171

5.7 遞歸 173

5.8 方法重載 175

5.9 可選參數 178

5.10 用異常實現基本錯誤處理 181

5.10.1 捕捉錯誤 182

5.10.2 使用throw語句報告錯誤 189

5.11 小結 194

第6章 類 195

6.1 類的聲明和實例化 198

6.2 實例字段 200

6.2.1 聲明實例字段 201

6.2.2 訪問實例字段 202

6.3 實例方法 202

6.4 使用this關鍵字 204

6.5 訪問修飾符 209

6.6 屬性 211

6.6.1 聲明屬性 212

6.6.2 自動實現的屬性 213

6.6.3 屬性和字段的設計規範 215

6.6.4 提供屬性驗證 216

6.6.5 只讀和只寫屬性 218

6.6.6 計算屬性 219

6.6.7 取值和賦值方法的訪問修飾符 221

6.6.8 屬性和方法調用不允許作為ref或out參數值 222

6.7 構造函數 223

6.7.1 聲明主構造函數 224

6.7.2 定義構造函數 225

6.7.3 默認和拷貝構造函數 225

6.7.4 對象初始化器 226

6.7.5 僅初始化的賦值函數 228

6.7.6 重載構造函數 229

6.7.7 構造函數鏈:使用this調用另一個構造函數 230

6.8 在構造函數中初始化非空引用類型的屬性 232

6.8.1 可讀/可寫非空引用類型的屬性 233

6.8.2 只讀自動實現的引用類型屬性 234

6.8.3 required修飾符 235

6.9 可空特性 238

6.10 解構函數 240

6.11 靜態成員 242

6.11.1 靜態字段 242

6.11.2 靜態方法 244

6.11.3 靜態構造函數 246

6.11.4 靜態屬性 247

6.11.5 靜態類 248

6.12 擴展方法 249

6.13 封裝數據 251

6.13.1 const 251

6.13.2 readonly 252

6.14 嵌套類 253

6.15 分部類 255

6.15.1 定義分部類 256

6.15.2 分部方法 257

6.16 小結 259

第7章 繼承 260

7.1 派生 261

7.1.1 基類型和派生類型之間的轉型 263

7.1.2 private訪問修飾符 265

7.1.3 protected訪問修飾符 266

7.1.4 擴展方法 267

7.1.5 單繼承 267

7.1.6 密封類 268

7.2 重寫基類 268

7.2.1 virtual修飾符 268

7.2.2 協變返回類型 271

7.2.3 new修飾符 271

7.2.4 sealed修飾符 274

7.2.5 base成員 275

7.2.6 調用基類構造函數 276

7.3 抽象類 278

7.4 所有類都從System.Object派生 282

7.5 類型檢查 283

7.5.1 使用is操作符進行類型檢查 284

7.5.2 用聲明進行類型檢查 285

7.5.3 使用switch語句進行類型檢查 286

7.5.4 使用switch表達式進行類型檢查 286

7.6 模式匹配 287

7.6.1 常量模式(C# 7.0) 287

7.6.2 關系模式(C# 9.0) 288

7.6.3 邏輯模式(C# 9.0) 289

7.6.4 圓括號模式(C# 9.0) 290

7.6.5 元組模式(C# 8.0) 290

7.6.6 位置模式(C# 8.0) 291

7.6.7 屬性模式(C# 8.0和C# 10.0) 292

7.6.8 when子句 294

7.6.9 使用無關類型進行模式匹配 294

7.6.10 遞歸模式匹配(C# 7.0) 295

7.6.11 列表模式 296

7.7 能利用多態性就避免模式匹配 298

7.8 小結 300

第8章 接口 301

8.1 接口概述 302

8.2 通過接口實現多態性 303

8.3 接口實現 307

8.3.1 顯式成員實現 308

8.3.2 隱式成員實現 309

8.3.3 比較顯式與隱式接口實現 310

8.4 在實現類和接口之間轉換 311

8.5 接口繼承 311

8.6 多接口繼承 313

8.7 接口上的擴展方法 314

8.8 版本控制 316

8.8.1 C# 8.0之前的接口版本控制 317

8.8.2 C# 8.0之後的接口版本控制 318

8.8.3 受保護接口成員提供了額外的封裝和多態性 325

8.9 比較擴展方法和默認接口成員 329

8.10 比較接口和抽象類 330

8.11 比較接口和特性 331

8.12 小結 331

第9章 結構和記錄 333

9.1 對比引用相等性和值相等性 336

9.2 結構 337

9.2.1 記錄結構 337

9.2.2 記錄結構的CIL代碼 339

9.3 記錄類 341

9.3.1 用屬性提供數據存儲 344

9.3.2 不可變值類型 345

9.3.3 使用with操作符克隆記錄 346

9.3.4 記錄構造函數 348

9.3.5 記錄結構初始化 348

9.3.6 記錄的解構函數 350

9.4 重寫object的成員 350

9.4.1 重寫ToString() 350

9.4.2 實現值相等性 352

9.4.3 自定義記錄的行為 356

9.5 裝箱 357

9.6 枚舉 363

9.6.1 在枚舉和字符串之間轉換 367

9.6.2 枚舉作為標志使用 368

9.7 小結 372

第10章 良好形式的類型 374

10.1 操作符重載 374

10.1.1 比較操作符 375

10.1.2 二元操作符 376

10.1.3 二元操作符復合賦值 377

10.1.4 條件邏輯操作符 378

10.1.5 一元操作符 378

10.1.6 轉換操作符 379

10.1.7 轉換操作符設計規範 380

10.2 引用其他程序集 381

10.2.1 引用庫 381

10.2.2 用Dotnet CLI引用項目或庫 382

10.2.3 在Visual Studio 2022中引用項目或庫 382

10.2.4 NuGet打包 382

10.2.5 用Dotnet CLI引用NuGet包 383

10.2.6 在Visual Studio 2022中引用NuGet包 383

10.2.7 調用NuGet包 384

10.3 類型封裝 385

10.3.1 類型聲明中的訪問修飾符public或internal 385

10.3.2 類型成員修飾符protected internal 386

10.3.3 file類型修飾符 386

10.4 定義命名空間 387

10.5 XML註釋 390

10.5.1 將XML註釋和編程構造關聯 390

10.5.2 生成XML文檔文件 392

10.6 垃圾回收和弱引用 393

10.7 資源清理 396

10.7.1 終結器 396

10.7.2 使用using語句進行確定性終結 399

10.7.3 垃圾回收、終結和IDisposable 402

10.8 推遲初始化 408

10.9 小結 409

第11章 異常處理 411

11.1 多異常類型 411

11.2 捕捉異常 414

11.3 重新拋出異常 415

11.4 常規catch塊 417

11.5 異常處理設計規範 417

11.6 自定義異常 420

11.7 重新拋出包裝的異常 423

11.8 小結 425

第12章 泛型 426

12.1 如果C#語言沒有泛型 426

12.2 泛型類型概述 431

12.2.1 使用泛型類 431

12.2.2 定義一個簡單的泛型類 433

12.2.3 泛型的優點 433

12.2.4 類型參數命名規範 434

12.2.5 泛型接口和結構 434

12.2.6 定義構造函數和終結器 436

12.2.7 指定默認值 437

12.2.8 多個類型參數 438

12.2.9 嵌套泛型類型 441

12.3 約束 441

12.3.1 接口約束 444

12.3.2 類型參數約束 445

12.3.3 unmanaged約束 447

12.3.4 notnull約束 447

12.3.5 struct/class約束 447

12.3.6 多個約束 448

12.3.7 構造函數約束 449

12.3.8 約束繼承 451

12.4 泛型方法 454

12.4.1 泛型方法類型推斷 455

12.4.2 指定約束 456

12.5 協變性和逆變性 457

12.5.1 使用out類型參數修飾符允許協變性 458

12.5.2 使用in類型參數修飾符允許逆變性 459

12.5.3 數組對不安全協變性的支持 462

12.6 泛型的內部機制 462

12.7 小結 465

第13章 委托和Lambda表達式 466

13.1 委托概述 467

13.1.1 背景 467

13.1.2 委托數據類型 469

13.2 聲明委托類型 470

13.2.1 常規用途的委托類型:System.Func和System.Action 470

13.2.2 實例化委托 472

13.3 Lambda表達式 476

13.4 表達式Lambda 479

13.5 匿名方法 481

13.6 委托沒有結構相等性 482

13.7 外部變量 484

13.8 表達式樹 489

13.8.1 Lambda表達式作為數據使用 489

13.8.2 表達式樹作為對象圖使用 490

13.8.3 對比委托和表達式樹 492

13.8.4 解析表達式樹 492

13.9 小結 494

第14章 事件 496

14.1 使用多播委托來編碼發布-訂閱模式 497

14.1.1 定義訂閱者方法 497

14.1.2 定義發布者 498

14.1.3 連接發布者和訂閱者 498

14.1.4 調用委托 499

14.1.5 檢查空值 500

14.1.6 委托操作符 501

14.1.7 順序調用 503

14.1.8 錯誤處理 504

14.1.9 方法返回值和傳引用 507

14.2 理解事件 507

14.2.1 事件的作用 507

14.2.2 聲明事件 509

14.2.3 編碼規範 510

14.2.4 實現自定義事件 514

14.3 小結 515

第15章 支持標準查詢操作符的集合接口 516

15.1 集合初始化器 517

15.2 IEnumerable使類成為集合 519

15.3.1 將foreach用於數組 519

15.3.2 將foreach用於IEnumerable<T> 519

15.3.3 foreach循環期間不要修改集合 523

15.3 標準查詢操作符 523

15.3.1 使用Where()來篩選 525

15.3.2 使用Select()來投射  526

15.3.3 使用Count()對元素進行計數 528

15.3.4 推遲執行  529

15.3.5 使用OrderBy()和ThenBy()來排序 532

15.3.6 使用Join()執行內連接 535

15.3.7 使用GroupBy分組結果 538

15.3.8 使用GroupJoin()實現一對多關系 539

15.3.9 調用SelectMany() 542

15.3.10 更多標準查詢操作符 543

15.4 匿名類型與LINQ  546

15.3.1 匿名類型 546

15.3.2 用LINQ投射成匿名類型 548

15.3.3 匿名類型和隱式局部變量的更多註意事項 549

15.5 小結 552

第16章 使用查詢表達式的LINQ 553

16.1 查詢表達式概述 553

16.1.1 投射 555

16.1.2 篩選 561

16.1.3 排序 562

16.1.4 let子句 562

16.1.5 分組 563

16.1.6 使用into實現查詢延續 566

16.1.7 用多個from子句“扁平化”序列的序列 567

16.2 查詢表達式只是方法調用 568

16.3 小結 569

第17章 構建自定義集合 570

17.1 更多集合接口 571

17.1.1 IList<T>和IDictionary<TKey, TValue> 572

17.1.2 ICollection<T> 572

17.2 主要集合類 572

17.2.1 列表集合:List<T> 573

17.2.1 全序 576

17.2.3 查找List<T> 576

17.2.4 字典集合Dictionary<TKey, TValue> 578

17.2.5 已排序集合:SortedDictionary<TKey, TValue>和SortedList<T> 583

17.2.6 棧集合:Stack<T> 584

17.2.7 隊列集合:Queue<T> 585

17.2.8 鏈表:LinkedList<T> 585

17.2.9 Span<T>和ReadOnlySpan<T> 586

17.3 提供索引器 587

17.4 返回null或者空集合 590

17.5 迭代器 591

17.5.1 定義迭代器 591

17.5.2 迭代器語法 592

17.5.3 從迭代器生成值 592

17.5.4 迭代器和狀態 594

17.5.5 更多的迭代器例子 595

17.5.6 將yield return語句放到循環中 596

17.5.7 取消更多的迭代:yield break 599

17.5.8 在類中創建多個迭代器 601

17.5.9 yield語句的要求 601

17.6 小結 602

第18章 反射、特性和動態編程 603

18.1 反射 603

18.1.1 使用System.Type訪問元數據 604

18.1.2 成員調用 606

18.1.3 泛型類型上的反射 610

18.2 nameof操作符 612

18.3 特性 613

18.3.1 自定義特性 617

18.3.2 查找特性 617

18.3.3 使用構造函數初始化特性 618

18.3.4 System.AttributeUsageAttribute 622

18.3.5 具名參數 623

18.3.6 預定義特性 625

18.3.7 System.ConditionalAttribute 625

18.3.8 System.ObsoleteAttribute 627

18.3.9 泛型特性 628

18.3.10 Caller*特性 628

18.4 使用動態對象進行編程 631

18.4.1 使用dynamic調用反射 632

18.4.2 dynamic的原則和行為 633

18.4.3 為什麽需要動態綁定 635

18.4.4 比較靜態編譯和動態編程 635

18.4.5 實現自定義動態對象 636

18.5 小結 639

第19章 多線程處理 640

19.1 多線程處理基礎 642

19.2 異步任務  645

19.2.1 為什麽要用TPL 646

19.2.2 理解異步任務 647

19.2.3 任務延續 650

19.2.4 用AggregateException處理任務的未處理異常 655

19.3 取消任務 660

19.3.1 Task.Run()是Task.Factory.StartNew()的簡化形式 663

19.3.2 長時間運行的任務 664

19.3.3 對任務進行資源清理 665

19.4 使用System.Threading 665

19.5 小結 666

第20章 基於任務的異步模式編程 667

20.1 以同步方式調用高延遲操作 668

20.2 使用TPL異步調用高延遲操作 670

20.3 使用async/await實現基於任務的異步模式 673

20.4 異步返回ValueTask<T> 678

20.5 異步流 680

20.6 IAsyncDisposable接口以及await using聲明和語句 684

20.7 通過IAsyncEnumerable來使用LINQ 684

20.8 從異步方法返回void 686

20.9 異步Lambda和本地函數 689

20.10 任務調度器和同步上下文 694

20.11 async/await和Windows UI 695

20.12 小結 698

第21章 並行迭代 699

21.1 並行迭代 699

20.2 並行執行LINQ查詢 706

21.3 小結 711

第22章 線程同步 712

22.1 線程同步的意義 713

22.1.1 用Monitor同步 716

22.1.2 使用lock關鍵字 718

22.1.3 lock對象的選擇 720

22.1.4 為什麽要避免鎖定this、typeof(type)和string 721

22.1.5 避免用MethodImplAttribute同步 721

22.1.6 將字段聲明為volatile 722

22.1.7 使用System.Threading.Interlocked類 722

22.1.8 多個線程時的事件通知 724

22.1.9 同步設計最佳實踐 725

22.1.10 更多同步類型 726

22.1.11 線程本地存儲 733

22.2 計時器 736

22.3 小結 737

第23章 平臺互操作性和不安全代碼 739

23.1 平臺調用 740

23.1.1 聲明外部函數 740

23.1.2 參數的數據類型 740

23.1.3 本機大小的整數 742

23.1.4 使用ref而不是指針 742

23.1.5 為順序佈局使用StructLayoutAttribute 743

23.1.6 內聯數組 743

23.1.7 跳過局部變量的初始化 744

23.1.8 錯誤處理 744

23.1.9 使用SafeHandle 746

23.1.10 調用外部函數 747

23.1.11 用包裝器簡化API調用 749

23.1.12 函數指針映射到委托 750

23.1.13 設計規範 750

23.2 指針和地址 751

23.2.1 不安全代碼 751

23.2.2  指針聲明 752

23.2.3 指針賦值 754

23.2.4 指針解引用 756

23.2.5 訪問被引用物類型的成員 758

23.3 通過委托執行不安全代碼 758

23.4 小結 760

第24章 公共語言基礎結構(CLI) 761

24.1 CLI的定義 762

24.2 CLI的實現 762

24.2.1 Microsoft .NET Framework 764

24.2.2 .NET Core 764

24.2.3 Xamarin 765

24.3 .NET Standard 765

24.4 BCL 765

24.5 C#編譯成機器碼 765

24.6 運行時 767

24.6.1 垃圾回收 767

24.6.2 平臺可移植性 769

24.6.3 性能 769

24.7 程序集、清單和模塊 770

24.8 公共中間語言 771

24.9 公共類型系統 772

24.10 公共語言規範 772

24.11 元數據 773

24.12 NET Native和AOT編譯 773

24.13 小結 774