第 I 部分 C# 語 言
第1 章 .NET 應用程序和工具 3
1.1 選擇技術 3
1.2 迴顧.NET 曆史 4
1.2.1 C# 1.0——一種新語言 4
1.2.2 帶有泛型的C# 2 和.NET 2 6
1.2.3 .NET 3.0——Windows Presentation Foundation 6
1.2.4 C# 3 和.NET 3.5——LINQ 6
1.2.5 C# 4 和.NET 4.0——dynamic 和TPL 7
1.2.6 C# 5 和異步編程 7
1.2.7 C# 6 和.NET Core 1.0 8
1.2.8 C# 7 和.NET Core 2.0 8
1.2.9 選擇技術,繼續前進 9
1.3 .NET 術語 10
1.3.1 .NET Framework 11
1.3.2 .NET Core 11
1.3.3 .NET Standard 11
1.3.4 NuGet 包 12
1.3.5 名稱空間 12
1.3.6 公共語言運行庫 13
1.3.7 Windows 運行庫 13
1.4 用.NET Core CLI 編譯 14
1.4.1 設置環境 14
1.4.2 創建應用程序 15
1.4.3 構建應用程序 16
1.4.4 運行應用程序 16
1.4.5 創建Web 應用程序 17
1.4.6 發布應用程序 17
1.5 使用Visual Studio 2017 19
1.6 應用程序類型和技術 24
1.6.1 數據訪問 24
1.6.2 Windows 應用程序 24
1.6.3 Xamarin 24
1.6.4 Web 應用程序 25
1.6.5 Web API 25
1.6.6 WebHooks 和SignalR 25
1.6.7 Microsoft Azure 25
1.7 開發工具 26
1.7.1 Visual Studio Community 27
1.7.2 Visual Studio Professional 27
1.7.3 Visual Studio Enterprise 27
1.7.4 Visual Studio for Mac 27
1.7.5 Visual Studio Code 27
1.8 小結 27
第2 章 核心C# 29
2.1 C#基礎 29
2.2 變量 31
2.2.1 初始化變量 31
2.2.2 類型推斷 32
2.2.3 變量的作用域 33
2.2.4 常量 34
2.3 預定義數據類型 35
2.3.1 值類型和引用類型 35
2.3.2 .NET 類型 36
2.3.3 預定義的值類型 36
2.3.4 預定義的引用類型 40
2.4 程序流控製 42
2.4.1 條件語句 42
2.4.2 循環 44
2.4.3 跳轉語句 47
2.5 名稱空間 47
2.5.1 using 語句 48
2.5.2 名稱空間的彆名 49
2.6 Main()方法 49
2.7 使用注釋 50
2.7.1 源文件中的內部注釋 50
2.7.2 XML 文檔 51
2.8 C#預處理器指令 52
2.8.1 #define 和#undef 52
2.8.2 #if、#elif、#else 和#endif 52
2.8.3 #warning 和 # error 53
2.8.4 #region 和#endregion 53
2.8.5 #line 53
2.8.6 #pragma 54
2.9 C#編程準則 54
2.9.1 關於標識符的規則 54
2.9.2 用法約定 55
2.10 小結 58
第3 章 對象和類型 59
3.1 創建及使用類 60
3.2 類和結構 60
3.3 類 61
3.3.1 字段 61
3.3.2 隻讀字段 61
3.3.3 屬性 62
3.3.4 匿名類型 65
3.3.5 方法 66
3.3.6 構造函數 69
3.4 結構 73
3.4.1 結構是值類型 74
3.4.2 隻讀結構 75
3.4.3 結構和繼承 75
3.4.4 結構的構造函數 75
3.4.5 ref 結構 76
3.5 按值和按引用傳遞參數 76
3.5.1 ref 參數 77
3.5.2 out 參數 77
3.5.3 in 參數 78
3.6 可空類型 79
3.7 枚舉類型 79
3.8 部分類 81
3.9 擴展方法 83
3.10 Object 類 83
3.11 小結 84
第4 章 繼承 85
4.1 麵嚮對象 85
4.2 繼承的類型 85
4.2.1 多重繼承 86
4.2.2 結構和類 86
4.3 實現繼承 86
4.3.1 虛方法 87
4.3.2 多態性 88
4.3.3 隱藏方法 89
4.3.4 調用方法的基類版本 90
4.3.5 抽象類和抽象方法 90
4.3.6 密封類和密封方法 91
4.3.7 派生類的構造函數 91
4.4 修飾符 93
4.4.1 訪問修飾符 93
4.4.2 其他修飾符 94
4.5 接口 94
4.5.1 定義和實現接口 95
4.5.2 派生的接口 97
4.6 is 和as 運算符 98
4.7 小結 99
第5 章 泛型 100
5.1 泛型概述 100
5.1.1 性能 101
5.1.2 類型安全 102
5.1.3 二進製代碼的重用 102
5.1.4 代碼的擴展 102
5.1.5 命名約定 102
5.2 創建泛型類 103
5.3 泛型類的功能 105
5.3.1 默認值 106
5.3.2 約束 106
5.3.3 繼承 108
5.3.4 靜態成員 108
5.4 泛型接口 109
5.4.1 協變和抗變 109
5.4.2 泛型接口的協變 110
5.4.3 泛型接口的抗變 111
5.5 泛型結構 111
5.6 泛型方法 113
5.6.1 泛型方法示例 113
5.6.2 帶約束的泛型方法 114
5.6.3 帶委托的泛型方法 115
5.6.4 泛型方法規範 115
5.7 小結 116
第6 章 運算符和類型強製轉換 117
6.1 運算符和類型轉換 117
6.2 運算符 118
6.2.1 運算符的簡化操作 119
6.2.2 運算符的優先級和關聯性 125
6.3 使用二進製運算符 126
6.3.1 位的移動 128
6.3.2 有符號數和無符號數 128
6.4 類型的安全性 129
6.4.1 類型轉換 130
6.4.2 裝箱和拆箱 132
6.5 比較對象的相等性 133
6.5.1 比較引用類型的相等性 133
6.5.2 比較值類型的相等性 134
6.6 運算符重載 135
6.6.1 運算符的工作方式 135
6.6.2 運算符重載的示例:Vector 結構 136
6.6.3 比較運算符的重載 139
6.6.4 可以重載的運算符 140
6.7 實現自定義的索引運算符 141
6.8 用戶定義的類型強製轉換 142
6.8.1 實現用戶定義的類型強製轉換 143
6.8.2 多重類型強製轉換 147
6.9 小結 150
第7 章 數組 151
7.1 相同類型的多個對象 151
7.2 簡單數組 152
7.2.1 數組的聲明 152
7.2.2 數組的初始化 152
7.2.3 訪問數組元素 153
7.2.4 使用引用類型 153
7.3 多維數組 154
7.4 鋸齒數組 155
7.5 Array 類 156
7.5.1 創建數組 156
7.5.2 復製數組 156
7.5.3 排序 157
7.6 數組作為參數 159
7.7 數組協變 159
7.8 枚舉 160
7.8.1 IEnumerator 接口 160
7.8.2 foreach 語句 160
7.8.3 yield 語句 161
7.9 結構比較 164
7.10 Span 165
7.10.1 創建切片 166
7.10.2 使用Span 改變值 166
7.10.3 隻讀的Span 167
7.11 數組池 167
7.11.1 創建數組池 168
7.11.2 從池中租用內存 168
7.11.3 將內存返迴給池 168
7.12 小結 169
第8 章 委托、lambda 錶達式和事件 170
8.1 引用方法 170
8.2 委托 170
8.2.1 聲明委托 171
8.2.2 使用委托 172
8.2.3 簡單的委托示例 174
8.2.4 Action<T>和Func<T>委托 175
8.2.5 BubbleSorter 示例 176
8.2.6 多播委托 177
8.2.7 匿名方法 180
8.3 lambda 錶達式 181
8.3.1 參數 181
8.3.2 多行代碼 181
8.3.3 閉包 182
8.4 事件 182
8.4.1 事件發布程序 182
8.4.2 事件偵聽器 184
8.5 小結 185
第9 章 字符串和正則錶達式 186
9.1 System.String 類 187
9.1.1 構建字符串 188
9.1.2 StringBuilder 成員 190
9.2 字符串格式 190
9.2.1 字符串插值 191
9.2.2 日期時間和數字的格式 192
9.2.3 自定義字符串格式 193
9.3 正則錶達式 194
9.3.1 正則錶達式概述 194
9.3.2 RegularExpressionsPlayground 示例 195
9.3.3 顯示結果 197
9.3.4 匹配、組和捕獲 198
9.4 字符串和Span 200
9.5 小結 201
第10 章 集閤 202
10.1 概述 202
10.2 集閤接口和類型 203
10.3 列錶 203
10.3.1 創建列錶 204
10.3.2 隻讀集閤 210
10.4 隊列 210
10.5 棧 213
10.6 鏈錶 214
10.7 有序列錶 217
10.8 字典 219
10.8.1 字典初始化器 219
10.8.2 鍵的類型 219
10.8.3 字典示例 220
10.8.4 Lookup 類 223
10.8.5 有序字典 223
10.9 集 224
10.10 性能 225
10.11 小結 227
第11 章 特殊的集閤 228
11.1 概述 228
11.2 處理位 228
11.2.1 BitArray 類 229
11.2.2 BitVector32 結構 230
11.3 可觀察的集閤 232
11.4 不變的集閤 233
11.4.1 使用構建器和不變的集閤 235
11.4.2 不變集閤類型和接口 235
11.4.3 使用LINQ 和不變的數組 236
11.5 並發集閤 236
11.5.1 創建管道 237
11.5.2 使用BlockingCollection 239
11.5.3 使用ConcurrentDictionary 240
11.5.4 完成管道 241
11.6 小結 242
第12 章 LINQ 243
12.1 LINQ 概述 243
12.1.1 列錶和實體 244
12.1.2 LINQ 查詢 246
12.1.3 擴展方法 246
12.1.4 推遲查詢的執行 248
12.2 標準的查詢操作符 249
12.2.1 篩選 250
12.2.2 用索引篩選 251
12.2.3 類型篩選 252
12.2.4 復閤的from 子句 252
12.2.5 排序 253
12.2.6 分組 254
12.2.7 LINQ 查詢中的變量 255
12.2.8 對嵌套的對象分組 255
12.2.9 內連接 256
12.2.10 左外連接 258
12.2.11 組連接 260
12.2.12 集閤操作 262
12.2.13 閤並 263
12.2.14 分區 264
12.2.15 聚閤操作符 264
12.2.16 轉換操作符 266
12.2.17 生成操作符 267
12.3 並行LINQ 267
12.3.1 並行查詢 268
12.3.2 分區器 268
12.3.3 取消 269
12.4 錶達式樹 269
12.5 LINQ 提供程序 271
12.6 小結 272
第13 章 C#函數式編程 273
13.1 概述 273
13.1.1 避免狀態突變 274
13.1.2 函數作為第一個類 275
13.2 錶達式體的成員 275
13.3 擴展方法 276
13.4 using static 聲明 277
13.5 本地函數 278
13.5.1 本地函數與yield 語句 279
13.5.2 遞歸本地函數 281
13.6 元組 282
13.6.1 元組的聲明和初始化 282
13.6.2 元組解構 283
13.6.3 元組的返迴 283
13.6.4 幕後的原理 284
13.6.5 ValueTuple 與元組的兼容性 285
13.6.6 推斷齣元組名稱 285
13.6.7 元組與鏈錶 286
13.6.8 元組和LINQ 286
13.6.9 解構 287
13.6.10 解構與擴展方法 288
13.7 模式匹配 288
13.7.1 模式匹配與is 運算符 288
13.7.2 模式匹配與switch 語句 290
13.7.3 模式匹配與泛型 291
13.8 小結 291
第14 章 錯誤和異常 292
14.1 簡介 292
14.2 異常類 293
14.3 捕獲異常 294
14.3.1 異常和性能 296
14.3.2 實現多個catch 塊 296
14.3.3 在其他代碼中捕獲異常 299
14.3.4 System.Exception 屬性 299
14.3.5 異常過濾器 299
14.3.6 重新拋齣異常 300
14.3.7 沒有處理異常時發生的情況 303
14.4 用戶定義的異常類 303
14.4.1 捕獲用戶定義的異常 304
14.4.2 拋齣用戶定義的異常 305
14.4.3 定義用戶定義的異常類 307
14.5 調用者信息 309
14.6 小結 310
第15 章 異步編程 311
15.1 異步編程的重要性 311
15.2 異步編程的.NET 曆史 312
15.2.1 同步調用 312
15.2.2 異步模式 313
15.2.3 基於事件的異步模式 314
15.2.4 基於任務的異步模式 314
15.2.5 異步Main()方法 315
15.3 異步編程的基礎 315
15.3.1 創建任務 316
15.3.2 調用異步方法 316
15.3.3 使用Awaiter 317
15.3.4 延續任務 317
15.3.5 同步上下文 318
15.3.6 使用多個異步方法 318
15.3.7 使用ValueTasks 319
15.3.8 轉換異步模式 320
15.4 錯誤處理 320
15.4.1 異步方法的異常處理 321
15.4.2 多個異步方法的異常處理 321
15.4.3 使用AggregateException 信息 322
15.5 異步與Windows 應用程序 322
15.5.1 配置await 323
15.5.2 切換到UI 綫程 324
15.5.3 使用IAsyncOperation 325
15.5.4 避免阻塞情況 325
15.6 小結 325
第16 章 反射、元數據和動態編程 326
16.1 在運行期間檢查代碼和動態編程 326
16.2 自定義特性 327
16.2.1 編寫自定義特性 327
16.2.2 自定義特性示例:WhatsNewAttributes 330
16.3 反射 331
16.3.1 System.Type 類 332
16.3.2 TypeView 示例 333
16.3.3 Assembly 類 335
16.3.4 完成WhatsNewAttributes 示例 336
16.4 為反射使用動態語言擴展 339
16.4.1 創建Calculator 庫 339
16.4.2 動態實例化類型 339
16.4.3 用Reflection API 調用成員 340
16.4.4 使用動態類型調用成員 340
16.5 dynamic 類型 341
16.6 DynamicObject 和ExpandoObject概述 344
16.6.1 DynamicObject 344
16.6.2 ExpandoObject 345
16.7 小結 347
第17 章 托管和非托管內存 348
17.1 內存 348
17.2 後颱內存管理 349
17.2.1 值數據類型 349
17.2.2 引用數據類型 350
17.2.3 垃圾收集 352
17.3 強引用和弱引用 354
17.4 處理非托管的資源 354
17.4.1 析構函數或終結器 355
17.4.2 IDisposable 接口 356
17.4.3 using 語句 356
17.4.4 實現IDisposable 接口和析構函數 357
17.4.5 IDisposable 和終結器的規則 358
17.5 不安全的代碼 358
17.5.1 用指針直接訪問內存 358
17.5.2 指針示例:PointerPlayground 364
17.5.3 使用指針優化性能 367
17.6 引用的語義 369
17.6.1 傳遞ref 和返迴ref 371
17.6.2 ref 和數組 371
17.7 Span<T> 373
17.7.1 Span 引用托管堆 373
17.7.2 Span 引用棧 373
17.7.3 Span 引用本機堆 374
17.7.4 Span 擴展方法 374
17.8 平颱調用 375
17.9 小結 378
第18 章 Visual Studio 2017 379
18.1 使用Visual Studio 2017 379
18.1.1 Visual Studio 的版本 382
18.1.2 Visual Studio 設置 382
18.2 創建項目 383
18.2.1 麵嚮多個版本的.NET 384
18.2.2 選擇項目類型 385
18.3 瀏覽並編寫項目 388
18.3.1 Solution Explorer 388
18.3.2 使用代碼編輯器 394
18.3.3 學習和理解其他窗口 399
18.3.4 排列窗口 402
18.4 構建項目 402
18.4.1 構建、編譯和生成代碼 403
18.4.2 調試版本和發布版本 403
18.4.3 選擇配置 404
18.4.4 編輯配置 404
18.5 調試代碼 406
18.5.1 設置斷點 407
18.5.2 使用數據提示和調試器可視化工具 407
18.5.3 Live Visual Tree 408
18.5.4 監視和修改變量 409
18.5.5 異常 409
18.5.6 多綫程 410
18.6 重構工具 411
18.7 診斷工具 412
18.8 通過Docker 創建和使用容器 415
18.8.1 Docker 簡介 416
18.8.2 在Docker 容器中運行ASP .NET Core 416
18.8.3 創建Dockerfile 417
18.8.4 使用Visual Studio 418
18.9 小結 420
第II 部分 .NET Core 與Windows Runtime
第19 章 庫、程序集、包和NuGet 423
19.1 庫的地獄 423
19.2 程序集 425
19.3 創建庫 426
19.3.1 .NET 標準 427
19.3.2 創建.NET 標準庫 428
19.3.3 解決方案文件 428
19.3.4 引用項目 429
19.3.5 引用NuGet 包 429
19.3.6 NuGet 的來源 430
19.3.7 使用.NET Framework 庫 431
19.4 使用共享項目 433
19.5 創建NuGet 包 435
19.5.1 NuGet 包和命令行 435
19.5.2 支持多個平颱 435
19.5.3 NuGet 包與Visual Studio 436
19.6 小結 438
第20 章 依賴注入 439
20.1 依賴注入的概念 439
20.1.1 使用沒有依賴注入的服務 440
20.1.2 使用依賴注入 441
20.2 使用.NET Core DI 容器 442
20.3 服務的生命周期 443
20.3.1 使用單例和臨時服務 445
20.3.2 使用Scoped 服務 446
20.3.3 使用自定義工廠 448
20.4 使用選項初始化服務 449
20.5 使用配置文件 450
20.6 創建平颱獨立性 452
20.6.1 .NET 標準庫 452
20.6.2 WPF 應用程序 453
20.6.3 UWP 應用程序 454
20.6.4 Xamarin 應用程序 455
20.7 使用其他DI 容器 456
20.8 小結 457
第21 章 任務和並行編程 458
21.1 概述 459
21.2 Parallel 類 460
21.2.1 使用Parallel.For()方法循環 460
21.2.2 提前中斷Parallel.For 462
21.2.3 Parallel.For()方法的初始化 462
21.2.4 使用Parallel.ForEach()方法循環 463
21.2.5 通過Parallel.Invoke()方法調用多個方法 464
21.3 任務 464
21.3.1 啓動任務 464
21.3.2 Future——任務的結果 466
21.3.3 連續的任務 467
21.3.4 任務層次結構 468
21.3.5 從方法中返迴任務 468
21.3.6 等待任務 468
21.4 取消架構 470
21.4.1 Parallel.For()方法的取消 470
21.4.2 任務的取消 471
21.5 數據流 472
21.5.1 使用動作塊 472
21.5.2 源和目標數據塊 473
21.5.3 連接塊 474
21.6 Timer 類 475
21.7 綫程問題 477
21.7.1 爭用條件 477
21.7.2 死鎖 479
21.8 lock 語句和綫程安全 480
21.9 Interlocked 類 483
21.10 Monitor 類 484
21.11 SpinLock 結構 485
21.12 WaitHandle 基類 485
21.13 Mutex 類 485
21.14 Semaphore 類 486
21.15 Events 類 487
21.16 Barrier 類 490
21.17 ReaderWriterLockSlim 類 492
21.18 Lock 和await 494
21.19 小結 496
第22 章 文件和流 497
22.1 概述 498
22.2 管理文件係統 498
22.2.1 檢查驅動器信息 499
22.2.2 使用Path 類 500
22.2.3 創建文件和文件夾 500
22.2.4 訪問和修改文件屬性 501
22.2.5 使用File 執行讀寫操作 502
22.3 枚舉文件 503
22.4 使用流 504
22.4.1 使用文件流 505
22.4.2 讀取流 508
22.4.3 寫入流 508
22.4.4 復製流 509
22.4.5 隨機訪問流 509
22.4.6 使用緩存的流 510
22.5 使用讀取器和寫入器 511
22.5.1 StreamReader 類 511
22.5.2 StreamWriter 類 512
22.5.3 讀寫二進製文件 512
22.6 壓縮文件 513
22.6.1 使用壓縮流 514
22.6.2 使用Brotli 514
22.6.3 壓縮文件 515
22.7 觀察文件的更改 515
22.8 使用內存映射的文件 516
22.8.1 使用訪問器創建內存映射文件 517
22.8.2 使用流創建內存映射文件 518
22.9 使用管道通信 520
22.9.1 創建命名管道服務器 520
22.9.2 創建命名管道客戶端 521
22.9.3 創建匿名管道 522
22.10 通過Windows 運行庫使用文件和流 523
22.10.1 Windows App 編輯器 523
22.10.2 把Windows Runtime 類型映射為.NET 類型 525
22.11 小結 526
第23 章 網絡 527
23.1 概述 527
23.2 HttpClient 類 528
23.2.1 發齣異步的Get 請求 528
23.2.2 拋齣異常 529
23.2.3 傳遞標題 529
23.2.4 訪問內容 531
23.2.5 用HttpMessageHandler 自定義請求 531
23.2.6 使用SendAsync 創建HttpRequestMessage 532
23.2.7 使用HttpClient和Windows Runtime 532
23.3 使用WebListener 類 534
23.4 使用實用工具類 536
23.4.1 URI 537
23.4.2 IPAddress 538
23.4.3 IPHostEntry 538
23.4.4 Dns 539
23.5 使用TCP 540
23.5.1 使用TCP 創建HTTP 客戶程序 540
23.5.2 創建TCP 偵聽器 541
23.5.3 創建TCP 客戶端 547
23.5.4 TCP 和UDP 550
23.6 使用UDP 550
23.6.1 建立UDP 接收器 550
23.6.2 創建UDP 發送器 551
23.6.3 使用多播 553
23.7 使用套接字 554
23.7.1 使用套接字創建偵聽器 554
23.7.2 使用NetworkStream 和套接字 556
23.7.3 通過套接字使用讀取器和寫入器 557
23.7.4 使用套接字實現接收器 557
23.8 小結 559
第24 章 安全性 560
24.1 概述 560
24.2 驗證用戶信息 561
24.2.1 使用Windows 標識 561
24.2.2 Windows Principal 562
24.2.3 使用聲稱 562
24.3 加密數據 564
24.3.1 創建和驗證簽名 565
24.3.2 實現安全的數據交換 567
24.3.3 使用RSA 簽名和散列 569
24.4 保護數據 571
24.4.1 實現數據保護 571
24.4.2 用戶機密 573
24.5 資源的訪問控製 575
24.6 Web 安全性 577
24.6.1 編碼 577
24.6.2 SQL 注入 579
24.6.3 跨站點請求僞造 580
24.7 小結 581
第25 章 ADO.NET 和事務 582
25.1 ADO.NET 概述 582
25.1.1 示例數據庫 583
25.1.2 NuGet 包和名稱空間 583
25.2 使用數據庫連接 584
25.2.1 管理連接字符串 585
25.2.2 連接池 585
25.2.3 連接信息 585
25.3 命令 587
25.3.1 ExecuteNonQuery()方法 587
25.3.2 ExecuteScalar()方法 588
25.3.3 ExecuteReader()方法 589
25.3.4 調用存儲過程 590
25.4 異步數據訪問 591
25.5 事務 592
25.6 事務和System.Transaction 595
25.6.1 可提交的事務 597
25.6.2 依賴事務 598
25.6.3 環境事務 599
25.6.4 嵌套作用域和環境事務 601
25.7 小結 602
第26 章 Entity Framework Core 604
26.1 Entity Framework 簡史 605
26.2 EF Core 簡介 606
26.2.1 創建模型 607
26.2.2 約定、注釋和流利API 607
26.2.3 創建上下文 608
26.2.4 創建數據庫 608
26.2.5 刪除數據庫 609
26.2.6 寫入數據庫 609
26.2.7 讀取數據庫 610
26.2.8 更新記錄 610
26.2.9 刪除記錄 611
26.2.10 日誌記錄 611
26.3 使用依賴注入 612
26.4 創建模型 614
26.4.1 創建關係 614
26.4.2 數據注釋 614
26.4.3 流利API 615
26.4.4 自包含類型的配置 616
26.4.5 在數據庫中搭建模型 617
26.4.6 映射到字段 618
26.4.7 陰影屬性 619
26.5 查詢 621
26.5.1 基本查詢 621
26.5.2 客戶端和服務器求值 622
26.5.3 原始SQL 查詢 623
26.5.4 已編譯查詢 624
26.5.5 全局查詢過濾器 624
26.5.6 EF.Functions 625
26.6 關係 625
26.6.1 使用約定的關係 625
26.6.2 顯式加載相關數據 627
26.6.3 即時加載相關數據 628
26.6.4 使用注釋的關係 628
26.6.5 使用流利API 的關係 629
26.6.6 根據約定的每個層次結構的錶 630
26.6.7 使用流利API 的每個層次結構中的錶 632
26.6.8 錶的拆分 633
26.6.9 擁有的實體 634
26.7 保存數據 636
26.7.1 用關係添加對象 636
26.7.2 對象的跟蹤 637
26.7.3 更新對象 638
26.7.4 更新未跟蹤的對象 638
26.7.5 批處理 639
26.8 衝突的處理 640
26.8.1 最後一個更改獲勝 640
26.8.2 第一個更改獲勝 641
26.9 上下文池 644
26.10 使用事務 644
26.10.1 使用隱式的事務 644
26.10.2 創建顯式的事務 646
26.11 遷移 647
26.11.1 準備項目文件 647
26.11.2 利用ASP.NET Core MVC 托管應用程序 648
26.11.3 托管.NET Core 控製颱應用程序 648
26.11.4 創建遷移 649
26.11.5 以編程方式應用遷移 651
26.11.6 應用遷移的其他方法 652
26.12 小結 652
第27 章 本地化 653
27.1 全球市場 653
27.2 System.Globalization 名稱空間 654
27.2.1 Unicode 問題 654
27.2.2 區域性和區域 655
27.2.3 使用區域性 658
27.2.4 排序 663
27.3 資源 664
27.3.1 資源讀取器和寫入器 664
27.3.2 使用資源文件生成器 665
27.3.3 通過ResourceManager 使用資源文件 666
27.3.4 System.Resources 名稱空間 666
27.4 使用ASP.NET Core 本地化 667
27.4.1 注冊本地化服務 667
27.4.2 注入本地化服務 668
27.4.3 區域性提供程序 668
27.4.4 在ASP.NET Core 中使用資源 669
27.4.5 使用控製器和視圖進行本地化 670
27.5 本地化UWP 674
27.5.1 給UWP 使用資源 674
27.5.2 使用多語言應用程序工具集進行本地化 675
27.6 小結 677
第28 章 測試 678
28.1 概述 678
28.2 使用MSTest 進行單元測試 679
28.2.1 使用MSTest 創建單元測試 679
28.2.2 運行單元測試 681
28.2.3 使用MSTest 預期異常 682
28.2.4 測試全部代碼路徑 683
28.2.5 外部依賴 683
28.3 使用xUnit 進行單元測試 685
28.3.1 使用xUnit 和.NET Core 686
28.3.2 創建Fact 屬性 686
28.3.3 創建Theory 特性 687
28.3.4 使用Mocking 庫 688
28.4 實時單元測試 690
28.5 使用EF Core 進行單元測試 692
28.6 使用Windows 應用程序進行UI測試 693
28.7 Web 集成、負載和性能測試 697
28.7.1 ASP.NET Core 集成測試 697
28.7.2 創建Web 測試 698
28.7.3 運行Web 測試 700
28.8 小結 702
第29 章 跟蹤、日誌和分析 703
29.1 診斷概述 703
29.2 使用EventSource 跟蹤 704
29.2.1 EventSource 的簡單用法 705
29.2.2 跟蹤工具 706
29.2.3 派生自EventSource 707
29.2.4 使用注釋和EventSource 709
29.2.5 創建事件清單模式 710
29.2.6 使用活動ID 712
29.3 創建自定義偵聽器 714
29.4 使用ILogger 接口編寫日誌 715
29.4.1 配置提供程序 716
29.4.2 使用作用域 717
29.4.3 過濾 718
29.4.4 配置日誌記錄 718
29.4.5 使用沒有依賴注入的ILogger 719
29.5 使用Visual Studio App Center進行分析 720
29.6 小結 722
第III 部分 Web 應用程序和服務
第30 章 ASP.NET Core 727
30.1 概述 727
30.2 Web 技術 728
30.2.1 HTML 728
30.2.2 CSS 729
30.2.3 JavaScript 和TypeScript 729
30.2.4 腳本庫 729
30.3 ASP.NET Web 項目 730
30.3.1 啓動 733
30.3.2 示例應用程序 735
30.4 添加客戶端內容 736
30.4.1 為客戶端內容使用工具 737
30.4.2 通過Bower 使用客戶端庫 738
30.4.3 使用JavaScript 包管理器npm 739
30.4.4 捆綁 739
30.4.5 用webpack 打包 740
30.5 請求和響應 741
30.5.1 請求標題 742
30.5.2 查詢字符串 744
30.5.3 編碼 745
30.5.4 錶單數據 745
30.5.5 cookie 746
30.5.6 發送JSON 747
30.6 依賴注入 747
30.6.1 定義服務 748
30.6.2 注冊服務 748
30.6.3 注入服務 748
30.6.4 調用控製器 749
30.7 簡單的路由 749
30.8 創建自定義的中間件 750
30.9 會話狀態 751
30.10 用ASP.NET Core 配置 752
30.10.1 讀取配置 753
30.10.2 修改配置提供程序 755
30.10.3 基於環境的不同配置 756
30.11 小結 757
第31 章 ASP.NET Core MVC 758
31.1 為ASP.NET Core MVC 建立服務 758
31.2 定義路由 760
31.2.1 添加路由 760
31.2.2 使用路由約束 761
31.3 創建控製器 761
31.3.1 理解動作方法 762
31.3.2 使用參數 762
31.3.3 返迴數據 762
31.3.4 使用Controller 基類和POCO控製器 763
31.4 創建視圖 765
31.4.1 嚮視圖傳遞數據 765
31.4.2 Razor 語法 766
31.4.3 創建強類型視圖 766
31.4.4 定義布局 767
31.4.5 用部分視圖定義內容 770
31.4.6 使用視圖組件 773
31.4.7 在視圖中使用依賴注入 774
31.4.8 為多個視圖導入名稱空間 775
31.5 從客戶端提交數據 775
31.5.1 模型綁定器 777
31.5.2 注解和驗證 778
31.6 使用HTML Helper 779
31.6.1 簡單的Helper 779
31.6.2 使用模型數據 779
31.6.3 定義HTML 特性 780
31.6.4 創建列錶 780
31.6.5 強類型化的Helper 781
31.6.6 編輯器擴展 782
31.6.7 實現模闆 782
31.7 Tag Helper 783
31.7.1 激活Tag Helper 783
31.7.2 使用錨定Tag Helper 783
31.7.3 使用Label Tag Helper 784
31.7.4 使用Input Tag Helper 785
31.7.5 使用錶單進行驗證 786
31.7.6 environment Tag Helper 787
31.7.7 創建自定義Tag Helper 788
31.7.8 用Tag Helper 創建元素 790
31.8 實現動作過濾器 792
31.9 創建數據驅動的應用程序 793
31.9.1 定義模型 794
31.9.2 創建數據庫 795
31.9.3 創建服務 796
31.9.4 創建控製器 798
31.9.5 創建視圖 800
31.10 實現身份驗證和授權 803
31.10.1 存儲和檢索用戶信息 803
31.10.2 啓動身份係統 804
31.10.3 執行用戶注冊 804
31.10.4 設置用戶登錄 806
31.10.5 驗證用戶的身份 807
31.10.6 使用Azure Active Directory 對用戶進行身份驗證 807
31.11 Razor 頁麵 812
31.11.1 創建一個Razor 頁麵項目 812
31.11.2 實現數據訪問 813
31.11.3 使用內聯代碼 814
31.11.4 使用內聯代碼和頁麵模型 816
31.11.5 使用代碼隱藏文件 817
31.11.6 頁麵參數 817
31.12 小結 818
第32 章 Web API 819
32.1 概述 819
32.2 創建服務 820
32.2.1 定義模型 821
32.2.2 創建服務 821
32.2.3 創建控製器 823
32.2.4 修改響應格式 824
32.2.5 REST 結果和狀態碼 825
32.3 創建異步服務 826
32.4 創建.NET 客戶端 827
32.4.1 發送GET 請求 828
32.4.2 從服務中接收XML 832
32.4.3 發送POST 請求 833
32.4.4 發送PUT 請求 833
32.4.5 發送DELETE 請求 834
32.5 寫入數據庫 835
32.5.1 使用EF Core 835
32.5.2 創建數據訪問服務 836
32.6 用OpenAPI 或Swagger 創建元數據 837
32.7 創建和使用OData服務 841
32.7.1 創建數據模型 842
32.7.2 創建數據庫 843
32.7.3 OData 啓動代碼 844
32.7.4 創建OData 控製器 844
32.7.5 OData 查詢 845
32.8 使用Azure Function 847
32.8.1 創建Azure Function 847
32.8.2 使用依賴注入容器 848
32.8.3 實現GET、POST 和PUT 請求 849
32.8.4 運行Azure Function 851
32.9 小結 852
第IV 部分 應用程序
第33 章 Windows 應用程序 855
33.1 Windows 應用程序簡介 855
33.1.1 Windows 運行庫 856
33.1.2 Hello, Windows 856
33.1.3 應用程序清單文件 857
33.1.4 應用程序啓動 859
33.1.5 主頁 859
33.2 XAML 861
33.2.1 XAML 標準 861
33.2.2 將元素映射到類 861
33.2.3 通過XAML 使用定製的.NET 類 862
33.2.4 將屬性用作特性 863
33.2.5 將屬性用作元素 863
33.2.6 依賴屬性 864
33.2.7 創建依賴屬性 864
33.2.8 值變更迴調和事件 865
33.2.9 路由事件 866
33.2.10 附加屬性 867
33.2.11 標記擴展 868
33.2.12 自定義標記擴展 869
33.2.13 條件XAML 870
33.3 控件 871
33.3.1 框架派生的UI 元素 872
33.3.2 控件派生的控件 875
33.3.3 範圍控件 881
33.3.4 內容控件 882
33.3.5 按鈕 883
33.3.6 項控件 884
33.3.7 Flyout 控件 884
33.4 數據綁定 884
33.4.1 用INotifyPropertyChanged 更改通知 885
33.4.2 創建圖書列錶 886
33.4.3 列錶綁定 887
33.4.4 把事件綁定到方法 887
33.4.5 使用數據模闆和數據模闆選擇器 888
33.4.6 綁定簡單對象 890
33.4.7 值的轉換 891
33.5 導航 892
33.5.1 導航迴最初的頁麵 892
33.5.2 重寫Page 類的導航 893
33.5.3 在頁麵之間導航 894
33.5.4 後退按鈕 895
33.5.5 Hub 896
33.5.6 Pivot 898
33.5.7 NavigationView 899
33.6 布局 902
33.6.1 StackPanel 902
33.6.2 Canvas 903
33.6.3 Grid 903
33.6.4 VariableSizedWrapGrid 904
33.6.5 RelativePanel 906
33.6.6 自適應觸發器 906
33.6.7 XAML 視圖 909
33.6.8 延遲加載 909
33.7 小結 910
第34 章 模式和XAML 應用程序 911
34.1 使用 MVVM 的原因 911
34.2 定義 MVVM 模式 912
34.3 共享代碼 913
34.3.1 使用API 協定和通用Windows平颱 913
34.3.2 使用共享項目 915
34.3.3 使用.NET 標準庫 916
34.4 示例解決方案 917
34.5 模型 918
34.5.1 實現變更通知 918
34.5.2 使用Repository 模式 919
34.6 服務 920
34.7 視圖模型 921
34.7.1 使用IEditableObject 923
34.7.2 視圖模型的具體實現 924
34.7.3 命令 925
34.7.4 服務、ViewModel 和依賴注入 926
34.8 視圖 927
34.8.1 從視圖模型中打開對話框 930
34.8.2 頁麵之間的導航 931
34.8.3 自適應用戶界麵 933
34.8.4 顯示進度信息 935
34.8.5 使用列錶項中的操作 936
34.9 使用事件傳遞消息 938
34.10 使用框架 939
34.11 小結 940
第35 章 樣式化Windows 應用程序 941
35.1 樣式設置 941
35.2 形狀 942
35.3 幾何圖形 944
35.3.1 使用段的幾何圖形 944
35.3.2 使用PathMarkup 的幾何圖形 945
35.4 變換 945
35.4.1 縮放 945
35.4.2 平移 946
35.4.3 鏇轉 946
35.4.4 傾斜 946
35.4.5 組閤變換和復閤變換 946
35.4.6 使用矩陣的變換 947
35.5 畫筆 947
35.5.1 SolidColorBrush 947
35.5.2 LinearGradientBrush 947
35.5.3 ImageBrush 948
35.5.4 AcrylicBrush 948
35.5.5 RevealBrush 949
35.6 樣式和資源 949
35.6.1 樣式 949
35.6.2 資源 951
35.6.3 從代碼中訪問資源 952
35.6.4 資源字典 952
35.6.5 主題資源 953
35.7 模闆 954
35.7.1 控件模闆 955
35.7.2 數據模闆 958
35.7.3 樣式化ListView 959
35.7.4 ListView 項的數據模闆 960
35.7.5 項容器的樣式 960
35.7.6 項麵闆 961
35.7.7 列錶視圖的控件模闆 961
35.8 動畫 962
35.8.1 時間軸 962
35.8.2 緩動函數 964
35.8.3 關鍵幀動畫 968
35.8.4 過渡 969
35.9 可視化狀態管理器 971
35.9.1 用控件模闆預定義狀態 972
35.9.2 定義自定義狀態 973
35.9.3 設置自定義的狀態 973
35.10 小結 974
第36 章 高級Windows 應用程序 975
36.1 概述 975
36.2 應用程序的生命周期 976
36.2.1 應用程序的執行狀態 976
36.2.2 在頁麵之間導航 976
36.3 導航狀態 978
36.3.1 暫停應用程序 979
36.3.2 激活暫停的應用程序 980
36.3.3 測試暫停 980
36.3.4 頁麵狀態 981
36.4 共享數據 983
36.4.1 共享源 983
36.4.2 共享目標 986
36.5 應用程序服務 991
36.5.1 創建模型 991
36.5.2 為應用程序服務連接創建後颱任務 992
36.5.3 注冊應用程序服務 993
36.5.4 調用應用程序服務 994
36.6 高級的編譯綁定 996
36.6.1 已編譯數據綁定的生命周期 996
36.6.2 綁定到方法上 997
36.6.3 用x:Bind 分階段 998
36.7 使用文本 1002
36.7.1 使用字體 1002
36.7.2 內聯和塊元素 1004
36.7.3 使用溢齣區域 1005
36.8 上墨 1008
36.9 自動建議 1011
36.10 小結 1013
第37 章 Xamarin.Forms 1015
37.1 Xamarin 開發入門 1015
37.1.1 用Android 架構Xamarin 1016
37.1.2 用iOS 架構Xamarin 1016
37.1.3 Xamarin.Forms 1017
37.2 Xamarin 開發工具 1018
37.2.1 Android 1018
37.2.2 iOS 1019
37.2.3 Visual Studio 2017 1019
37.2.4 Visual Studio for Mac 1019
37.2.5 Visual Studio App Center 1020
37.3 Android 基礎 1020
37.3.1 活動 1021
37.3.2 資源 1022
37.3.3 顯示列錶 1022
37.3.4 顯示消息 1024
37.4 iOS 基礎 1025
37.4.1 iOS 應用程序結構 1025
37.4.2 故事闆 1026
37.4.3 控製器 1028
37.4.4 顯示消息 1028
37.5 Xamarin. Forms 應用程序 1029
37.5.1 托管Xamarin 的Windows應用程序 1029
37.5.2 托管Xamarin 的Android 1030
37.5.3 托管Xamarin 的iOS 1031
37.5.4 共享的項目 1031
37.6 使用公共庫 1032
37.7 控件層次結構 1032
37.8 頁麵 1033
37.9 導航 1034
37.10 布局 1035
37.11 視圖 1037
37.12 數據綁定 1037
37.13 命令 1038
37.14 ListView 和ViewCell 1038
37.15 小結 1039
附贈章節電子版(請掃描封底二維碼獲取)
第1 章 Composition 1
BC1.1 概述 1
BC1.2 Composition 庫的體係結構 2
BC1.2.1 使用特性的Composition 3
BC1.2.2 基於約定的部件注冊 8
BC1.3 定義協定 10
BC1.4 導齣部件 13
BC1.4.1 創建部件 13
BC1.4.2 使用部件的部件 17
BC1.4.3 導齣元數據 17
BC1.4.4 使用元數據進行惰性加載 19
BC1.5 導入部件 19
BC1.5.1 導入連接 22
BC1.5.2 部件的惰性加載 23
BC1.5.3 讀取元數據 23
BC1.6 小結 25
第2 章 XML 和JSON 26
BC2.1 數據格式 26
BC2.1.1 XML 27
BC2.1.2 .NET 支持的XML 標準 28
BC2.1.3 在框架中使用XML 28
BC2.1.4 JSON 29
BC2.2 讀寫流格式的XML 30
BC2.2.1 使用XmlReader 類讀取XML 31
BC2.2.2 使用XmlWriter 類 33
BC2.3 在.NET 中使用DOM 34
BC2.3.1 使用XmlDocument 類讀取 35
BC2.3.2 遍曆層次結構 35
BC2.3.3 使用XmlDocument 插入節點 36
BC2.4 使用XPathNavigator 類 37
BC2.4.1 XPathDocument 類 37
BC2.4.2 XPathNavigator 類 37
BC2.4.3 XPathNodeIterator 類 38
BC2.4.4 使用XPath 導航XML 38
BC2.4.5 使用XPath 評估 39
BC2.4.6 用XPath 修改XML 39
BC2.5 在XML 中序列化對象 40
BC2.5.1 序列化簡單對象 40
BC2.5.2 序列化一個對象樹 42
BC2.5.3 沒有特性的序列化 44
BC2.6 LINQ to XML 46
BC2.6.1 XDocument 對象 46
BC2.6.2 XElement 對象 47
BC2.6.3 XNamespace 對象 47
BC2.6.4 XComment 對象 49
BC2.6.5 XAttribute 對象 49
BC2.6.6 使用LINQ 查詢XML 文檔 50
BC2.6.7 查詢動態的XML 文檔 50
BC2.6.8 轉換為對象 52
BC2.6.9 轉換為XML 52
BC2.7 JSON 53
BC2.7.1 創建JSON 53
BC2.7.2 轉換對象 54
BC2.7.3 序列化對象 55
BC2.7.4 遍曆JSON 節點 55
BC2.8 小結 56
第3 章 WebHooks 和SignalR 57
BC3.1 概述 57
BC3.2 WebSockets 58
BC3.2.1 WebSockets 服務器 58
BC3.2.2 WebSockets 客戶端 60
BC3.3 使用SignalR 的簡單聊天程序 62
BC3.3.1 創建集綫器 62
BC3.3.2 用HTML 和JavaScript 創建客戶端 63
BC3.3.3 創建SignalR .NET 客戶端 65
BC3.4 分組連接 68
BC3.4.1 用分組擴展集綫器 68
BC3.4.2 用分組擴展Windows 客戶端 69
BC3.5 WebHooks 的體係結構 71
BC3.6 創建Dropbox 和GitHub 接收器 72
BC3.6.1 創建Web 應用程序 73
BC3.6.2 為Dropbox 和GitHub 配置WebHooks 73
BC3.6.3 實現處理程序 73
BC3.6.4 用Dropbox 和GitHub 配置應用程序 76
BC3.6.5 運行應用程序 77
BC3.7 小結 77
第4 章 機器人和認知服務 79
BC4.1 機器人的定義 79
BC4.2 創建對話框機器人 80
BC4.2.1 配置狀態服務 81
BC4.2.2 接收機器人消息 .82
BC4.2.3 定義對話框 83
BC4.2.4 使用PromptDialog 85
BC4.3 為對話框使用Form Flow 88
BC4.4 創建英雄卡 89
BC4.5 機器人和LUIS 91
BC4.5.1 定義意圖和話語 92
BC4.5.2 訪問LUIS 中的建議 95
BC4.5.3 使用帶有活動檢查的Form Flow 96
BC4.6 小結 96
第5 章 Windows 應用程序的更多特性 97
BC5.1 概述 97
BC5.2 相機 98
BC5.3 Geolocation 和MapControl 99
BC5.3.1 使用MapControl 99
BC5.3.2 使用Geolocator 定位信息 102
BC5.3.3 街景地圖 103
BC5.3.4 繼續請求位置信息 104
BC5.4 傳感器 105
BC5.4.1 光綫 106
BC5.4.2 羅盤 107
BC5.4.3 加速計 107
BC5.4.4 傾斜計 108
BC5.4.5 陀螺儀 109
BC5.4.6 方嚮 109
BC5.4.7 Rolling Marble 示例 110
BC5.5 小結 112
· · · · · · (
收起)