內容簡介
這本專家級指南是有經驗的程式設計師學習C#的超快方式。C#旨在幫助開發人員更快地完成更多工作,沒有人比Microsoft MVP Christian Nagel更適合撰寫這樣一本對於現實開發有巨大幫助作用的權威指南。他從實用的角度出發,以清晰且易於理解的方式,向開發人員展示了如何為Windows和Linux平台構建.NET解決方案,如何使用Microsoft Azure服務來擴展開發,並以其他多種有意義的方式進行互動。
主要內容:
為需要新的庫和工具的高級開發人員介紹了C#和.NET的眾多新特性
揭示了使用.NET庫的最佳技巧和實用提示,包括通道、異步流和新的JSON序列化器等
論述了使用ASP.NET Core、gRPC、SignalR、Azure Functions和Docker開發微服務的創新方式
為開發Web應用程式提供了逐步指導,包括ASP.NET Core Razor、ASP.NET Core Blazor Server和Blazor WebAssembly
討論了如何使用新的WinUI 3庫開發Windows桌面應用程式
圖書目錄
第 I 部分 C#語言
第1章 .NET應用程式和工具 3
1.1 從.NET Framework到.NET Core,
再到.NET 3
1.2 .NET術語 4
1.2.1 .NET SDK 4
1.2.2 .NET運行庫 5
1.2.3 公共語言運行庫 5
1.2.4 .NET編譯平台 6
1.2.5 .NET Framework 6
1.2.6 .NET Core 6
1.2.7 .NET 7
1.2.8 .NET Standard 7
1.2.9 NuGet包 7
1.2.10 名稱空間 8
1.3 .NET支持周期 9
1.4 應用程式類型和技術 9
1.4.1 數據訪問 9
1.4.2 Windows應用程式 10
1.4.3 Web應用程式 10
1.4.4 服務 11
1.4.5 SignalR 11
1.4.6 Microsoft Azure 11
1.5 開發工具 13
1.5.1 .NET CLI 13
1.5.2 Visual Studio Code 13
1.5.3 Visual Studio Community 13
1.5.4 Visual Studio Professional 13
1.5.5 Visual Studio Enterprise 13
1.5.6 Visual Studio for Mac 14
1.5.7 Windows終端 14
1.5.8 WSL 2 14
1.5.9 Docker Desktop 14
1.6 使用.NET CLI 15
1.6.1 創建應用程式 15
1.6.2 頂級語句 16
1.6.3 選擇框架和語言版本 16
1.6.4 構建應用程式 17
1.6.5 運行應用程式 18
1.6.6 創建Web應用程式 18
1.6.7 發布應用程式 19
1.6.8 自包含部署 19
1.6.9 創建單個執行檔 20
1.6.10 readytorun 20
1.6.11 剪裁 21
1.7 小結 21
第2章 核心C# 23
2.1 C#基礎 24
2.1.1 頂級語句 24
2.1.2 變數 25
2.1.3 命令行實參 25
2.1.4 變數的作用域 26
2.1.5 常量 27
2.1.6 在頂級語句中使用方法和類型 28
2.2 可空類型 28
2.2.1 可空值類型 29
2.2.2 可空引用類型 29
2.3 使用預定義數據類型 31
2.3.1 整型 31
2.3.2 BigInteger 32
2.3.3 本機整數類型 32
2.3.4 數字分隔設定 32
2.3.5 二進制值 32
2.3.6 浮點類型 33
2.3.7 bool類型 33
2.3.8 字元類型 34
2.3.9 數字的字面值 34
2.3.10 object類型 34
2.4 程式流控制 35
2.4.1 if語句 35
2.4.2 is運算符的模式匹配 36
2.4.3 switch語句 36
2.4.4 switch語句的模式匹配 37
2.4.5 switch表達式 38
2.4.6 for循環 39
2.4.7 while循環 41
2.4.8 do…while循環 41
2.4.9 foreach循環 41
2.4.10 退出循環 42
2.5 名稱空間 42
2.5.1 using語句 43
2.5.2 名稱空間的別名 43
2.6 使用字元串 43
2.6.1 使用StringBuilder 43
2.6.2 字元串插值 44
2.6.3 FormattableString 44
2.6.4 字元串格式 45
2.6.5 verbatim字元串 45
2.6.6 字元串的範圍 46
2.7 注釋 46
2.7.1 源檔案中的內部注釋 46
2.7.2 XML文檔 47
2.8 C#預處理器指令 48
2.8.1 #define和#undef 48
2.8.2 #if、#elif、#else和#endif 49
2.8.3 #warning和#error 50
2.8.4 #region和#endregion 50
2.8.5 #line 50
2.8.6 #pragma 51
2.8.7 #nullable 51
2.9 C#編程準則 51
2.9.1 關於標識符的規則 51
2.9.2 用法約定 52
2.9.3 命名約定 52
2.9.4 屬性和方法的使用 54
2.9.5 欄位的使用 54
2.10 小結 55
第3章 類、記錄、結構和元組 56
3.1 創建及使用類型 57
3.2 按值傳遞和按引用傳遞 57
3.3 類 59
3.3.1 欄位 60
3.3.2 唯讀欄位 60
3.3.3 屬性 61
3.3.4 方法 64
3.3.5 構造函式 68
3.3.6 局部函式 70
3.3.7 泛型方法 71
3.3.8 擴展方法 71
3.3.9 匿名類型 72
3.4 記錄 73
3.4.1 不可變類型 73
3.4.2 名義記錄 73
3.4.3 位置記錄 73
3.4.4 記錄的相等性比較 74
3.4.5 with表達式 74
3.5 結構 75
3.6 枚舉類型 76
3.7 ref、in和out 78
3.7.1 ref參數 78
3.7.2 in參數 79
3.7.3 ref return 80
3.7.4 out參數 81
3.8 元組 81
3.8.1 聲明和初始化元組 82
3.8.2 元組解構 83
3.8.3 元組的返回 83
3.9 ValueTuple 83
3.10 解構 84
3.11 模式匹配 85
3.11.1 使用元組進行模式匹配 85
3.11.2 屬性模式 86
3.12 分部類型 87
3.13 小結 89
第4章 C#面向對象編程 90
4.1 面向對象 90
4.2 類的繼承 91
4.2.1 虛方法 91
4.2.2 隱藏方法 94
4.2.3 調用方法的基類版本 95
4.2.4 抽象類和抽象方法 96
4.2.5 密封類和密封方法 96
4.2.6 派生類的構造函式 97
4.3 修飾符 99
4.3.1 訪問修飾符 99
4.3.2 其他修飾符 100
4.4 記錄的繼承 100
4.5 使用接口 101
4.5.1 預定義接口 102
4.5.2 使用接口進行依賴注入 104
4.5.3 顯式和隱式實現的接口 105
4.5.4 對比接口和類 106
4.5.5 默認接口方法 106
4.6 泛型 109
4.7 小結 112
第5章 運算符和類型強制轉換 113
5.1 運算符 113
5.1.1 複合賦值運算符 114
5.1.2 條件運算符 115
5.1.3 checked和unchecked運算符 115
5.1.4 is和as運算符 116
5.1.5 sizeof運算符 117
5.1.6 typeof運算符 118
5.1.7 nameof 運算符 118
5.1.8 索引器 118
5.1.9 空合併運算符和空合併賦值
運算符 119
5.1.10 空值條件運算符 119
5.2 使用二進制運算符 121
5.2.1 位的移動 122
5.2.2 有符號數和無符號數 123
5.3 類型的安全性 125
5.3.1 類型轉換 125
5.3.2 裝箱和拆箱 128
5.4 運算符重載 128
5.4.1 運算符的工作方式 129
5.4.2 Vector類型的運算符重載 130
5.5 比較對象的相等性 132
5.6 實現自定義的索引器 134
5.7 用戶定義的轉換 136
5.7.1 實現用戶定義的類型強制轉換 136
5.7.2 多重類型強制轉換 142
5.8 小結 145
第6章 數組 147
6.1 相同類型的多個對象 147
6.2 簡單數組 148
6.2.1 數組的聲明和初始化 148
6.2.2 訪問數組元素 149
6.2.3 使用引用類型 149
6.3 多維數組 150
6.4 鋸齒數組 151
6.5 Array類 152
6.5.1 創建數組 152
6.5.2 複製數組 153
6.5.3 排序 154
6.6 數組作為參數 156
6.7 枚舉器 157
6.7.1 IEnumerator接口 157
6.7.2 foreach語句 158
6.7.3 yield語句 158
6.8 對數組使用Span 160
6.8.1 創建切片 160
6.8.2 使用Span改變值 161
6.8.3 唯讀的Span 162
6.9 索引和範圍 163
6.9.1 索引和hat運算符 163
6.9.2 範圍 163
6.9.3 高效地修改數組內容 164
6.9.4 自定義集合的索引和範圍 165
6.10 數組池 165
6.10.1 創建數組池 165
6.10.2 從池中租用記憶體 166
6.10.3 將記憶體返回給池 166
6.11 BitArray 167
6.12 小結 169
第7章 委託、lambda表達式和事件 171
7.1 引用方法 171
7.2 委託 172
7.2.1 聲明委託 172
7.2.2 使用委託 173
7.2.3 將委託傳遞給方法 175
7.2.4 Action<T>和Func<T>委託 176
7.2.5 多播委託 177
7.2.6 匿名方法 179
7.3 lambda表達式 180
7.3.1 參數 181
7.3.2 多行代碼 181
7.3.3 閉包 181
7.4 事件 182
7.4.1 事件發布程式 183
7.4.2 事件偵聽器 184
7.5 小結 185
第8章 集合 187
8.1 概述 187
8.2 集合接口和類型 188
8.3 列表 188
8.3.1 創建列表 189
8.3.2 集合初始化器 190
8.3.3 添加元素 190
8.3.4 插入元素 191
8.3.5 訪問元素 191
8.3.6 刪除元素 192
8.3.7 搜尋 192
8.3.8 排序 194
8.3.9 唯讀集合 195
8.3.10 佇列 195
8.4 棧 199
8.5 鍊表 200
8.6 有序列表 202
8.7 字典 203
8.7.1 字典初始化器 204
8.7.2 鍵的類型 204
8.7.3 字典示例 206
8.7.4 Lookup類 209
8.7.5 有序字典 209
8.8 集 210
8.9 性能 212
8.10 不變的集合 213
8.10.1 使用構建器和不變的集合 215
8.10.2 不變集合類型和接口 215
8.10.3 使用LINQ和不變的數組 216
8.11 小結 216
第9章 LINQ 217
9.1 LINQ概述 217
9.1.1 列表和實體 218
9.1.2 LINQ查詢 220
9.1.3 擴展方法 220
9.1.4 推遲查詢的執行 221
9.2 標準的查詢操作符 223
9.2.1 篩選 224
9.2.2 用索引篩選 225
9.2.3 類型篩選 226
9.2.4 複合的from子句 226
9.2.5 排序 227
9.2.6 分組 229
9.2.7 LINQ 查詢中的變數 230
9.2.8 對嵌套的對象分組 231
9.2.9 內連線 232
9.2.10 左外連線 235
9.2.11 組連線 236
9.2.12 集操作 239
9.2.13 合併 240
9.2.14 分區 241
9.2.15 聚合操作符 242
9.2.16 轉換操作符 243
9.2.17 生成操作符 245
9.3 並行LINQ 246
9.3.1 並行查詢 246
9.3.2 取消 247
9.4 表達式樹 248
9.5 LINQ提供程式 250
9.6 小結 251
第10章 錯誤和異常 253
10.1 處理錯誤 253
10.2 預定義的異常類 254
10.3 捕獲異常 255
10.3.1 異常和性能 257
10.3.2 實現多個catch塊 258
10.3.3 捕獲其他代碼中的異常 260
10.3.4 System.Exception屬性 261
10.3.5 異常過濾器 261
10.3.6 重新拋出異常 262
10.3.7 沒有處理異常時發生的情況 266
10.4 用戶定義的異常類 266
10.4.1 捕獲用戶定義的異常 267
10.4.2 拋出用戶定義的異常 269
10.4.3 定義用戶定義的異常類 272
10.5 調用者信息 273
10.6 小結 275
第11章 任務和異步編程 277
11.1 異步編程的重要性 277
11.2 基於任務的異步模式 278
11.3 任務 280
11.3.1 創建任務 280
11.3.2 調用異步方法 281
11.3.3 使用Awaiter 282
11.3.4 延續任務 282
11.3.5 同步上下文 283
11.3.6 使用多個異步方法 283
11.3.7 使用ValueTasks 284
11.4 錯誤處理 285
11.4.1 異步方法的異常處理 286
15.4.2 多個異步方法的異常處理 286
11.4.3 使用AggregateException
信息 287
11.5 取消異步方法 288
11.6 異步流 289
11.7 異步與Windows應用程式 290
11.7.1 配置await 291
11.7.2 切換到UI執行緒 292
11.7.3 使用IAsyncOperation 293
11.7.4 避免阻塞情況 293
11.8 小結 294
第12章 反射、元數據和原始碼生成器 295
12.1 在運行期間檢查代碼和動態
編程 295
12.2 自定義特性 296
12.2.1 編寫自定義特性 296
12.2.2 自定義特性示例:
WhatsNewAttributes 299
12.3 使用反射 301
12.3.1 System.Type類 301
12.3.2 TypeView示例 303
12.3.3 Assembly類 305
12.3.4 完成WhatsNewAttributes
示例 306
12.4 為反射使用動態語言擴展 309
12.4.1 創建Calculator庫 309
12.4.2 動態實例化類型 310
12.4.3 用Reflection API調用成員 310
12.4.4 使用動態類型調用成員 311
12.5 ExpandoObject 312
12.6 原始碼生成器 314
12.6.1 Hello, World原始碼生成器 314
12.6.2 使用分部方法的原始碼
生成器 316
12.7 小結 320
第13章 託管和非託管記憶體 321
13.1 記憶體 321
13.2 後台記憶體管理 322
13.2.1 值數據類型 322
13.2.2 引用數據類型 324
13.2.3 垃圾收集 326
13.3 強引用和弱引用 328
13.4 處理非託管的資源 329
13.4.1 析構函式或終結器 329
13.4.2 IDisposable和IAsyncDisposable
接口 330
13.4.3 using語句和using聲明 331
13.4.4 實現IDisposable接口和析構
函式 332
13.4.5 IDisposable和終結器的規則 333
13.5 不安全的代碼 333
13.5.1 用指針直接訪問記憶體 334
13.5.2 用unsafe關鍵字編寫不安全
的代碼 334
13.5.3 指針的語法 335
13.5.4 將指針強制轉換為整數類型 337
13.5.5 指針類型之間的強制轉換 337
13.5.6 void指針 337
13.5.7 指針算術的運算 338
13.5.8 sizeof運算符 339
13.5.9 結構指針:指針成員訪問
運算符 339
13.5.10 類成員的指針 340
13.5.11 指針示例:PointerPlayground 341
13.5.12 函式指針 344
13.5.13 使用指針最佳化性能 345
13.6 Span<T> 348
13.6.1 Span引用託管堆 349
13.6.2 Span引用棧 349
13.6.3 Span引用本機堆 350
13.6.4 Span擴展方法 351
13.7 平台調用 351
13.7.1 調用本機Windows API 352
13.7.2 調用Linux本機API 354
13.7.3 使用庫調用本機API 356
13.8 小結 356
第 II 部分 庫
第14章 庫、程式集、包和NuGet 359
14.1 庫的地獄 359
14.2 程式集 361
14.3 創建和使用庫 362
14.3.1 .NET 標準 363
14.3.2 創建.NET標準庫 363
14.3.3 解決方案檔案 364
14.3.4 引用項目 364
14.3.5 引用NuGet包 365
14.3.6 NuGet的來源 366
14.4 創建NuGet包 367
14.4.1 NuGet包和命令行 367
14.4.2 支持多個平台 368
14.4.3 NuGet包與Visual Studio 370
14.5 模組初始化器 371
14.6 小結 372
第15章 依賴注入和配置 373
15.1 依賴注入的概念 373
15.2 使用.NET DI容器 374
15.3 使用Host類 376
15.4 服務的生存期 376
15.4.1 使用單例和臨時服務 378
15.4.2 使用Scoped服務 380
15.4.3 使用自定義工廠 383
15.5 使用選項初始化服務 384
15.6 使用配置檔案 385
15.7 .NET應用程式的配置 387
15.7.1 使用IConfiguration 387
15.7.2 讀取強類型的值 388
15.7.3 配置源 388
15.7.4 生產和開發設定 389
15.7.5 用戶秘密 390
15.8 Azure App Configuration 391
15.8.1 創建Azure App Configuration 391
15.8.2 在開發環境中使用
Azure App Configuration 392
15.8.3 動態配置 394
15.8.4 使用Azure App Configuration
的生產和準備設定 395
15.8.5 特性標誌 395
15.8.6 使用Azure Key Vault 397
15.9 小結 398
第16章 診斷和指標 399
16.1 診斷概述 399
16.2 日誌 401
16.2.1 配置提供程式 403
16.2.2 過濾 405
16.2.3 配置日誌記錄 406
16.2.4 使用OpenTelemetry進行
日誌記錄和跟蹤 406
16.2.5 更多日誌提供程式 408
16.3 指標 408
16.3.1 EventSource類 409
16.3.2 指標計數器 409
16.3.3 使用MetricsSampleSource 411
16.3.4 使用.NET CLI監控指標 412
16.4 使用Visual Studio App Center
進行分析 413
16.5 Application Insights 416
16.6 小結 417
第17章 並行編程 419
17.1 概述 420
17.2 Parallel類 421
17.2.1 使用Parallel.For()方法循環 421
17.2.2 提前中斷Parallel.For() 423
17.2.3 Parallel.For()方法的初始化 424
17.2.4 使用Parallel.ForEach()方法
循環 425
17.2.5 通過Parallel.Invoke()方法調用
多個方法 425
17.3 任務 426
17.3.1 啟動任務 426
17.3.2 任務的結果 429
17.3.3 連續的任務 429
17.3.4 任務層次結構 430
17.3.5 從方法中返回任務 431
17.3.6 等待任務 431
17.3.7 ValueTask 431
17.4 取消架構 433
17.4.1 Parallel.For()方法的取消 433
17.4.2 任務的取消 434
17.5 通道 436
17.5.1 創建有界和無界通道 436
17.5.2 寫入通道 437
17.5.3 從通道讀取數據 438
17.5.4 通道的異步流 438
17.6 Timer類 439
17.6.1 使用Timer類 439
17.6.2 WinUI DispatcherTimer 439
17.7 執行緒問題 441
17.7.1 爭用條件 441
17.7.2 死鎖 444
17.8 Interlocked類 445
17.9 Monitor類 446
17.10 SpinLock結構 447
17.11 WaitHandle類 447
17.12 Mutex類 447
17.13 Semaphore類 448
17.14 Events類 450
17.15 Barrier類 453
17.16 ReaderWriterLockSlim類 456
17.17 lock和await 458
17.18 小結 461
第18章 檔案和流 463
18.1 概述 464
18.2 管理檔案系統 464
18.2.1 檢查驅動器信息 464
18.2.2 使用Path類 465
18.2.3 創建檔案和資料夾 466
18.2.4 訪問和修改檔案屬性 467
18.2.5 使用File執行讀寫操作 469
18.3 枚舉檔案 470
18.4 使用流 471
18.4.1 使用檔案流 472
18.4.2 讀取流 475
18.4.3 寫入流 476
18.4.4 複製流 476
18.4.5 隨機訪問流 477
18.4.6 使用快取的流 479
18.5 使用讀取器和寫入器 479
18.5.1 StreamReader類 480
18.5.2 StreamWriter類 481
18.5.3 讀寫二進制檔案 481
18.6 壓縮檔案 482
18.6.1 使用壓縮流 482
18.6.2 使用Brotli 483
18.6.3 壓縮檔案 484
18.7 觀察檔案的更改 484
18.8 JSON序列化 485
18.8.1 JSON序列化 486
18.8.2 JSON反序列化 488
18.8.3 使用JsonDocument 489
18.8.4 JSON讀取器 490
18.8.5 JSON寫入器 490
18.9 通過Windows運行庫使用
檔案和流 491
18.9.1 Windows App編輯器 492
18.9.2 把Windows Runtime類型
映射為.NET類型 494
18.10 小結 496
第19章 網路 497
19.1 概述 497
19.2 使用實用工具類 498
19.2.1 URI 498
19.2.2 IPAddress 499
19.2.3 IPHostEntry 501
19.2.4 DNS 501
19.2.5 配置套接字 502
19.3 使用套接字 503
19.3.1 使用套接字的TCP Echo示例 503
19.3.2 創建偵聽器 505
19.3.3 使用管道進行通信 506
19.3.4 實現接收器 508
19.4 使用TCP類 509
19.4.1 創建TCP偵聽器 510
19.4.2 創建TCP客戶端 512
19.5 使用UDP 513
19.5.1 建立UDP接收器 513
19.5.2 創建UDP傳送器 515
19.5.3 使用多播 517
19.6 使用Web伺服器 518
19.6.1 配置Kestrel 519
19.6.2 Startup 520
19.6.3 HTTP頭 521
19.7 HttpClient類 523
19.7.1 發出異步的Get請求 524
19.7.2 拋出異常 525
19.7.3 創建HttpRequestMessage 526
19.7.4 傳遞頭 526
19.7.5 訪問內容 528
19.7.6 用HttpMessageHandler
自定義請求 528
19.8 HttpClient工廠 530
19.8.1 類型化的客戶端 530
19.8.2 命名的客戶端 530
19.8.3 彈性HTTP請求 531
19.9 小結 532
第20章 安全性 535
20.1 安全性的重要方面 535
20.2 驗證用戶信息 536
20.2.1 使用Microsoft標識平台 536
20.2.2 使用Microsoft.Identity.Client 536
20.2.3 在Web應用程式中使用身份
驗證和授權 540
20.3 加密數據 542
20.3.1 獲得X.509證書 545
20.3.2 創建和驗證簽名 547
20.3.3 實現安全的數據交換 549
20.4 確保Web安全 552
20.4.1 編碼 552
20.4.2 防範SQL注入 554
20.4.3 防範跨站點請求偽造 555
20.5 小結 557
第21章 Entity Framework Core 559
21.1 Entity Framework簡介 560
21.1.1 資料庫提供程式 560
21.1.2 創建Azure SQL資料庫 560
21.1.3 創建模型 561
21.1.4 創建上下文 562
21.1.5 約定、注釋和流式API 563
21.1.6 使用DI提供程式配置上下文 563
21.1.7 創建資料庫 564
21.1.8 刪除資料庫 565
21.1.9 寫入資料庫 565
21.1.10 讀取資料庫 566
21.1.11 更新類 567
21.1.12 更新記錄 567
21.1.13 刪除記錄 568
21.1.14 日誌和指標 568
21.2 創建模型 569
21.2.1 創建關係 569
21.2.2 使用流式API來映射定義 570
21.2.3 使用自包含類型的配置 571
21.2.4 映射到欄位 573
21.2.5 使用影子屬性 574
21.3 在資料庫中搭建模型 576
21.4 遷移 577
21.4.1 實現
IDesignTimeDbContextFactory 577
21.4.2 創建遷移 578
21.4.3 以編程方式套用遷移 580
21.4.4 套用遷移的其他方法 581
21.5 使用查詢 581
21.5.1 基本查詢 582
21.5.2 異步流 584
21.5.3 原始SQL查詢 584
21.5.4 已編譯查詢 584
21.5.5 全局查詢過濾器 586
21.5.6 EF.Functions 586
21.6 載入相關數據 587
21.6.1 預先載入相關數據 587
21.6.2 使用帶過濾條件的Include()的
預先載入 588
21.6.3 顯式載入相關數據 588
21.6.4 延遲載入 590
21.7 使用關係 591
21.7.1 多對多關係 591
21.7.2 表的拆分 594
21.7.3 擁有的實體 595
21.7.4 每個層次結構一張表 597
21.8 保存數據 599
21.8.1 用關係添加對象 600
21.8.2 對象的跟蹤 601
21.8.3 更新對象 602
21.8.4 更新未跟蹤的對象 603
21.9 衝突的處理 604
21.9.1 最後一個更改獲勝 604
21.9.2 第一個更改獲勝 606
21.10 使用事務 608
21.10.1 使用隱式的事務 608
21.10.2 創建顯式的事務 609
21.10.3 使用環境事務 610
21.11 使用Azure Cosmos DB 611
21.12 小結 616
第22章 本地化 617
22.1 全球市場 617
22.2 System.Globalization名稱空間 618
22.2.1 Unicode問題 618
22.2.2 區域性和區域 619
22.2.3 使用區域性 622
22.2.4 排序 627
22.3 資源 629
22.3.1 資源讀取器和寫入器 629
22.3.2 通過ResourceManager使用
資源檔案 630
22.4 使用ASP.NET Core本地化 631
22.4.1 註冊本地化服務 631
22.4.2 配置中間件 631
22.4.3 ASP.NET Core區域性提供
程式 632
22.4.4 在ASP.NET Core中使用
區域性 633
22.4.5 在ASP.NET Core中使用
資源 634
22.4.6 使用數據注釋進行本地化 635
22.5 本地化WinUI 636
22.5.1 使用MRT ResourceLoader 637
22.5.2 使用MRT ResourceManager 637
22.5.3 使用ResourceContext修改
資源 638
22.6 小結 639
第23章 測試 641
23.1 概述 641
23.2 單元測試 642
23.2.1 創建單元測試 642
23.2.2 運行單元測試 643
23.2.3 實現複雜的方法 644
23.2.4 預期異常 645
23.2.5 測試全部代碼路徑 645
23.2.6 代碼覆蓋率 646
23.2.7 外部依賴 647
23.3 使用模擬庫 650
23.4 ASP.NET Core集成測試 654
23.5 小結 655
第 III 部分 Web應用程式和服務
第24章 ASP.NET Core 659
24.1 Web技術 659
24.1.1 HTML 660
24.1.2 CSS 660
24.1.3 JavaScript和TypeScript 660
24.1.4 腳本庫 661
24.1.5 WebAssembly 661
24.2 創建ASP.NET Core Web項目 661
24.2.1 宿主伺服器 663
24.2.2 啟動 663
24.2.3 示例應用程式 665
24.3 添加客戶端內容 666
24.4 創建自定義中間件 668
24.5 端點路由 670
24.5.1 定義路由 670
24.5.2 路由約束 671
24.6 請求和回響 672
24.6.1 請求頭 673
24.6.2 查詢參數 675
24.6.3 表單數據 675
24.6.4 cookie 676
24.6.5 傳送JSON 677
24.7 會話狀態 677
24.8 健康檢查 679
24.9 部署 682
24.10 小結 683
第25章 服務 685
25.1 理解今天的服務 685
25.2 使用ASP.NET Core創建REST
服務 686
25.2.1 定義模型 687
25.2.2 創建服務 687
25.2.3 創建控制器 690
25.2.4 測試REST API 693
25.2.5 REST結果和狀態碼 694
25.3 創建.NET客戶端 694
25.3.1 傳送GET請求 696
25.3.2 傳送POST請求 698
25.3.3 傳送PUT請求 698
25.3.4 傳送DELETE請求 699
25.4 使用EF Core和服務 700
25.5 使用Azure AD B2C進行身份
驗證和授權 703
25.5.1 創建和配置服務 706
25.5.2 在客戶端應用程式中添加
身份驗證 707
25.6 通過gRPC實現和使用服務 709
25.6.1 創建一個gRPC項目 709
25.6.2 使用Protobuf定義契約 710
25.6.3 實現一個gRPC服務 712
25.6.4 實現一個gRPC客戶端 713
25.6.5 gRPC的流傳輸 715
25.7 使用Azure Functions 717
25.7.1 創建一個Azure Functions
項目 717
25.7.2 添加HTTP Trigger函式 719
25.8 更多Azure服務 720
25.9 小結 720
第26章 Razor頁面和MVC 723
26.1 為Razor頁面和MVC建立
服務 723
26.1.1 創建Razor頁面項目 724
26.1.2 理解Razor語法 725
26.2 Razor頁面 726
26.2.1 布局 727
26.2.2 在視圖間傳遞數據 728
26.2.3 渲染節 728
26.2.4 帶參數的路由 729
26.2.5 Razor庫和區域 731
26.2.6 注入服務 732
26.2.7 返回結果 732
26.2.8 模型綁定 733
26.2.9 使用HTML Helper 733
26.2.10 使用Tag Helper 735
26.2.11 驗證用戶輸入 736
26.2.12 創建自定義Tag Helper 736
26.2.13 用Tag Helper創建元素 738
26.2.14 視圖組件 741
26.3 ASP.NET Core MVC 744
26.3.1 啟動MVC 744
26.3.2 MVC路由 745
26.3.3 控制器 745
26.3.4 Razor視圖 746
26.3.5 標識UI 748
26.4 小結 749
第27章 Blazor 751
27.1 Blazor Server和
Blazor Assembly 751
27.1.1 Blazor Server 752
27.1.2 WebAssembly 752
27.1.3 BlazorWebAssembly 753
27.2 創建Blazor Server Web
應用程式 753
27.2.1 啟動Blazor Server 754
27.2.2 Blazor布局 755
27.2.3 導航 756
27.2.4 Counter組件 757
27.2.5 FetchData組件 758
27.3 BlazorWebAssembly 759
27.3.1 啟動BlazorWebAssembly 760
27.3.2 在BlazorWebAssembly中
注入HttpClient 761
27.3.3 使用漸進式Web應用程式 762
27.4 Razor組件 763
27.4.1 理解組件的參數 763
27.4.2 注入服務 764
27.4.3 使用事件回調 765
27.4.4 通過代碼更新UI 767
27.4.5 雙向綁定 767
27.4.6 級聯參數 768
27.4.7 使用模板化組件 769
27.4.8 使用內置組件 770
27.5 小結 771
第28章 SignalR 773
28.1 概述 773
28.2 使用SignalR創建一個簡單的
聊天 774
28.2.1 創建中心 774
28.2.2 使用HTML和JavaScript創建
客戶端 776
28.2.3 創建SignalR .NET客戶端 778
28.3 連線分組 781
28.3.1 使用組擴展中心 781
28.3.2 使用組擴展Windows客戶端
應用程式 783
28.4 使用SignalR進行流傳輸 785
28.5 小結 787
第 IV 部分 應用程式
第29章 Windows應用程式 791
29.1 Windows應用程式簡介 791
29.1.1 Windows運行庫 793
29.1.2 Hello, Windows 793
29.1.3 應用程式清單檔案 794
29.1.4 應用程式啟動 795
29.1.5 主視窗 796
29.2 XAML 797
29.2.1 將元素映射到類 798
29.2.2 通過XAML使用自定義的
.NET類 799
29.2.3 將屬性用作特性 800
29.2.4 將屬性用作元素 800
29.2.5 依賴屬性 801
29.2.6 創建依賴屬性 802
29.2.7 值變更回調和事件 802
29.2.8 路由事件 803
29.2.9 附加屬性 804
29.2.10 標記擴展 807
29.2.11 自定義標記擴展 807
29.3 使用控制項 808
29.3.1 派生自FrameworkElement的
UI元素 809
29.3.2 Control派生的控制項 811
29.3.3 範圍控制項 817
29.3.4 內容控制項 818
29.3.5 按鈕 819
29.3.6 項控制項 821
29.3.7 Flyout控制項 821
29.4 使用數據綁定 821
29.4.1 用INotifyPropertyChanged
更改通知 822
29.4.2 創建圖書列表 824
29.4.3 列表綁定 824
29.4.4 把事件綁定到方法 825
29.4.5 使用數據模板和數據模板
選擇器 826
29.4.6 顯示列表和詳細信息 827
29.4.7 綁定簡單對象 828
29.4.8 值的轉換 829
29.5 實現導航 830
29.5.1 Hub 831
29.5.2 TabView 832
29.5.3 NavigationView 833
29.6 實現布局面板 835
29.6.1 StackPanel 836
29.6.2 Grid 836
29.6.3 VariableSizedWrapGrid 837
29.6.4 RelativePanel 839
29.6.5 自適應觸發器 840
29.6.6 延遲載入 842
29.7 小結 843
第30章 模式和XAML應用程式 845
30.1 使用 MVVM的原因 845
30.2 定義MVVM模式 846
30.3 示例解決方案 847
30.4 模型 848
30.5 服務 850
30.6 視圖模型 852
30.6.1 IEditableObject 854
30.6.2 視圖模型的具體實現 855
30.6.3 命令 857
30.6.4 服務、ViewModel和依賴
注入 858
30.7 視圖 859
30.7.1 從視圖模型中打開對話框 861
30.7.2 頁面之間的導航 862
30.8 使用事件傳遞訊息 865
30.9 小結 866
第31章 樣式化Windows應用程式 867
31.1 樣式設定 867
31.2 形狀 868
31.3 幾何圖形 870
31.3.1 使用段的幾何圖形 870
31.3.2 使用路徑標記的幾何圖形 871
31.4 變換 872
31.4.1 縮放 872
31.4.2 平移 872
31.4.3 旋轉 873
31.4.4 傾斜 873
31.4.5 組合變換和複合變換 873
31.4.6 使用矩陣的變換 873
31.5 筆刷 874
31.5.1 SolidColorBrush 874
31.5.2 漸變筆刷 875
31.5.3 ImageBrush 875
31.5.4 AcrylicBrush 876
31.6 樣式和資源 876
31.6.1 樣式 877
31.6.2 資源層次結構 878
31.6.3 主題資源 879
31.7 模板 881
31.7.1 控制項模板 881
31.7.2 樣式化ListView 883
31.7.3 項容器的樣式 885
31.7.4 項面板 886
31.8 動畫 887
31.8.1 時間軸 887
31.8.2 緩動函式 888
31.8.3 關鍵幀動畫 893
31.8.4 過渡 894
31.9 可視化狀態管理器 896
31.9.1 用控制項模板預定義狀態 897
31.9.2 定義自定義狀態 898
31.9.3 設定自定義的狀態 899
31.10 小結 899