內容簡介
這個新版本對上一版做了全面修訂,涵蓋C# 10和.NET 6的所有新功能。
本書討論面向對象編程、編寫函式、測試函式、調試函式、實現接口以及繼承類等主題;介紹.NET API,這些API可執行多種任務,如管理和查詢數據,監視和改進性能,以及使用檔案系統、異步流、序列化和加密。你可用ASP.NET Core來構建和部署本書列舉的跨平台示例應用程式,如網站和服務。
在學習C#語言和許多.NET庫的過程中,為確保不會因不必要的套用代碼而分心,第1~12章構建的是控制台應用程式;打下堅實基礎後,第13~17章再使用ASP.NET Core、MVC模式以及Blazor構建實際的應用程式和服務。
第18章講述如何使用Web API、OData、gRPC、GraphQL、SignalR和Azure Functions等技術構建服務;第19章討論如何使用.NET MAUI構建跨平台應用程式。
圖書目錄
第1章 C#與.NET入門 1
1.1 設定開發環境 2
1.1.1 選擇適合學習的工具和應用程式類型 2
1.1.2 跨平台部署 4
1.1.3 下載並安裝Visual Studio 2022 for Windows 5
1.1.4 下載並安裝 Visual Studio Code 6
1.2 理解.NET 8
1.2.1 理解.NET Framework 8
1.2.2 理解Mono、Xamarin和Unity項目 8
1.2.3 理解.NET Core 8
1.2.4 了解.NET的未來版本 9
1.2.5 了解.NET支持 10
1.2.6 現代.NET的區別 11
1.2.7 現代.NET的主題 12
1.2.8 了解.NET Standard 12
1.2.9 本書使用的.NET平台和工具 13
1.2.10 理解中間語言 13
1.2.11 比較.NET技術 14
1.3 使用Visual Studio 2022構建控制台應用程式 14
1.3.1 使用Visual Studio 2022管理多個項目 14
1.3.2 使用Visual Studio 2022編寫代碼 14
1.3.3 使用Visual Studio編譯和運行代碼 15
1.3.4 編寫頂級程式 16
1.3.5 使用Visual Studio 2022添加第二個項目 17
1.4 使用Visual Studio Code構建控制台應用程式 19
1.4.1 使用Visual Studio Code管理多個項目 19
1.4.2 使用Visual Studio Code編寫代碼 19
1.4.3 使用dotnet命令行編譯和運行代碼 21
1.4.4 使用Visual Studio Code添加第二個項目 22
1.4.5 使用Visual Studio Code管理多個檔案 23
1.5 使用.NET Interactive Notebooks探索代碼 23
1.5.1 創建一個Notebook 23
1.5.2 在Notebook上編寫和運行代碼 24
1.5.3 保存Notebook 25
1.5.4 給Notebook添加Markdown和特殊命令 25
1.5.5 在多個單元中執行代碼 26
1.5.6 為本書中的代碼使用.NET Interactive Notebooks 27
1.6 檢查項目的資料夾和檔案 27
1.6.1 了解常見的資料夾和檔案 28
1.6.2 理解GitHub中的解決方案代碼 28
1.7 充分利用本書的GitHub存儲庫 28
1.7.1 對本書提出問題 29
1.7.2 反饋 29
1.7.3 從GitHub存儲庫下載解決方案代碼 29
1.7.4 使用Git、Visual Studio Code和命令行 30
1.8 尋求幫助 30
1.8.1 閱讀微軟文檔 30
1.8.2 獲取關於dotnet工具的幫助 30
1.8.3 獲取類型及其成員的定義 31
1.8.4 在Stack Overflow上尋找答案 33
1.8.5 使用谷歌搜尋答案 33
1.8.6 訂閱官方的.NET部落格 33
1.8.7 觀看Scott Hanselman的視頻 34
1.9 實踐和探索 34
1.9.1 練習1.1:測試你掌握的知識 34
1.9.2 練習1.2:在任何地方練習C# 34
1.9.3 練習1.3:探索主題 34
1.10 本章小結 35
第2章 C#編程基礎 36
2.1 介紹C# 36
2.1.1 理解語言版本和特性 36
2.1.2 了解C#標準 39
2.1.3 發現C#編譯器版本 40
2.2 理解C#語法和辭彙 41
2.2.1 顯示編譯器版本 42
2.2.2 了解C#語法 43
2.2.3 語句 43
2.2.4 注釋 43
2.2.5 塊 44
2.2.6 語句和塊的示例 44
2.2.7 了解C#辭彙表 44
2.2.8 將程式語言與人類語言進行比較 44
2.2.9 改變C#語法的配色方案 45
2.2.10 如何編寫正確的代碼 45
2.2.11 導入名稱空間 46
2.2.12 動詞表示方法 48
2.2.13 名詞表示類型、變數、欄位和屬性 49
2.2.14 揭示C#辭彙表的範圍 49
2.3 使用變數 51
2.3.1 命名和賦值 51
2.3.2 字面值 52
2.3.3 存儲文本 52
2.3.4 存儲數字 53
2.3.5 存儲實數 54
2.3.6 存儲布爾值 57
2.3.7 存儲任何類型的對象 57
2.3.8 動態存儲類型 58
2.3.9 聲明局部變數 59
2.3.10 獲取和設定類型的默認值 61
2.3.11 在數組中存儲多個值 61
2.4 深入研究控制台應用程式 62
2.4.1 向用戶顯示輸出 63
2.4.2 從用戶那裡獲取文本輸入 65
2.4.3 簡化控制台的使用 66
2.4.4 獲取用戶的重要輸入 66
2.4.5 向控制台應用程式傳遞參數 67
2.4.6 使用參數設定選項 68
2.4.7 處理不支持API的平台 70
2.5 實踐和探索 71
2.5.1 練習2.1:測試你掌握的知識 71
2.5.2 練習2.2:測試對數字類型的了解 72
2.5.3 練習2.3:練習數字的大小和範圍 72
2.5.4 練習2.4:探索主題 72
2.6 本章小結 73
第3章 控制程式流程、轉換類型和處理異常 74
3.1 操作變數 74
3.1.1 一元算術運算符 75
3.1.2 二元算術運算符 76
3.1.3 賦值運算符 77
3.1.4 邏輯運算符 77
3.1.5 條件邏輯運算符 78
3.1.6 按位和二元移位運算符 79
3.1.7 其他運算符 80
3.2 理解選擇語句 81
3.2.1 使用if語句進行分支 81
3.2.2 模式匹配與if語句 82
3.2.3 使用switch語句進行分支 83
3.2.4 模式匹配與switch語句 84
3.2.5 使用switch表達式簡化switch語句 86
3.3 理解疊代語句 86
3.3.1 while循環語句 86
3.3.2 do循環語句 87
3.3.3 for循環語句 87
3.3.4 foreach循環語句 88
3.4 類型轉換 88
3.4.1 隱式和顯式地轉換數值 89
3.4.2 使用System.Convert類型進行轉換 90
3.4.3 圓整數字 90
3.4.4 控制圓整規則 91
3.4.5 從任何類型轉換為字元串 92
3.4.6 從二進制對象轉換為字元串 92
3.4.7 將字元串轉換為數值或日期和時間 93
3.5 處理異常 94
3.6 檢查溢出 98
3.6.1 使用checked語句拋出溢出異常 98
3.6.2 使用unchecked語句禁用編譯時檢查溢出 99
3.7 實踐和探索 100
3.7.1 練習3.1:測試你掌握的知識 100
3.7.2 練習3.2:探索循環和溢出 100
3.7.3 練習3.3:實踐循環和運算符 101
3.7.4 練習3.4:實踐異常處理 101
3.7.5 練習3.5:測試你對運算符的認識程度 101
3.7.6 練習3.6:探索主題 102
3.8 本章小結 102
第4章 編寫、調試和測試函式 103
4.1 編寫函式 103
4.1.1 乘法表示例 103
4.1.2 編寫帶返回值的函式 105
4.1.3 將數字從序數轉換為基數 106
4.1.4 用遞歸計算階乘 108
4.1.5 使用XML注釋解釋函式 110
4.1.6 在函式實現中使用lambda 111
4.2 在開發過程中進行調試 113
4.2.1 創建帶有故意錯誤的代碼 113
4.2.2 設定斷點並開始調試 114
4.2.3 使用調試工具列進行導航 116
4.2.4 調試窗格 117
4.2.5 單步執行代碼 117
4.2.6 自定義斷點 119
4.3 在開發和運行時進行日誌記錄 120
4.3.1 理解日誌記錄選項 120
4.3.2 使用Debug和Trace類型 120
4.3.3 配置跟蹤偵聽器 122
4.3.4 切換跟蹤級別 123
4.4 單元測試 127
4.4.1 理解測試類型 127
4.4.2 創建需要測試的類庫 128
4.4.3 編寫單元測試 129
4.5 在函式中拋出和捕獲異常 131
4.5.1 理解使用錯誤和執行錯誤 131
4.5.2 在函式中通常拋出異常 131
4.5.3 理解調用堆疊 132
4.5.4 在哪裡捕獲異常 134
4.5.5 重新拋出異常 134
4.5.6 實現tester-doer模式 136
4.6 實踐和探索 136
4.6.1 練習4.1:測試你掌握的知識 137
4.6.2 練習4.2:使用調試和單元測試練習函式的編寫 137
4.6.3 練習4.3:探索主題 137
4.7 本章小結 138
第5章 使用面向對象編程技術構建自己的類型 139
5.1 面向對象編程 139
5.2 構建類庫 140
5.2.1 創建類庫 140
5.2.2 在名稱空間中定義類 141
5.2.3 成員 142
5.2.4 實例化類 142
5.2.5 導入名稱空間以使用類型 143
5.2.6 對象 144
5.3 在欄位中存儲數據 145
5.3.1 定義欄位 145
5.3.2 理解訪問修飾符 145
5.3.3 設定和輸出欄位值 146
5.3.4 使用enum類型存儲值 146
5.3.5 使用enum類型存儲多個值 147
5.4 使用集合存儲多個值 149
5.4.1 理解泛型集合 149
5.4.2 使欄位成為靜態欄位 150
5.4.3 使欄位成為常量 151
5.4.4 使欄位唯讀 151
5.4.5 使用構造函式初始化欄位 152
5.5 寫入和調用方法 153
5.5.1 從方法返回值 153
5.5.2 使用元組組合多個返回值 154
5.5.3 定義參數並將參數傳遞給方法 157
5.5.4 重載方法 157
5.5.5 傳遞可選參數和命名參數 158
5.5.6 控制參數的傳遞方式 159
5.5.7 理解ref返回 160
5.5.8 使用partial關鍵字分割類 160
5.6 使用屬性和索引器控制訪問 161
5.6.1 定義唯讀屬性 161
5.6.2 定義可設定的屬性 162
5.6.3 要求在實例化期間設定屬性 163
5.6.4 定義索引器 164
5.7 模式匹配和對象 165
5.7.1 創建和引用.NET 6類庫 165
5.7.2 定義飛機乘客 165
5.7.3 C# 9.0對模式匹配做了增強 167
5.8 使用記錄 167
5.8.1 init-only屬性 167
5.8.2 理解記錄 168
5.8.3 記錄中的位置數據成員 169
5.9 實踐和探索 170
5.9.1 練習5.1:測試你掌握的知識 170
5.9.2 練習5.2:探索主題 170
5.10 本章小結 170
第6章 實現接口和繼承類 171
6.1 建立類庫和控制台應用程式 171
6.2 方法的更多信息 172
6.2.1 使用方法實現功能 173
6.2.2 使用運算符實現功能 174
6.2.3 使用局部函式實現功能 175
6.3 觸發和處理事件 176
6.3.1 使用委託調用方法 176
6.3.2 定義和處理委託 177
6.3.3 定義和處理事件 178
6.4 使用泛型安全地重用類型 179
6.4.1 使用非泛型類型 179
6.4.2 使用泛型類型 180
6.5 實現接口 181
6.5.1 公共接口 181
6.5.2 排序時比較對象 181
6.5.3 使用單獨的類比較對象 183
6.5.4 隱式和顯式接口實現 184
6.5.5 使用默認實現定義接口 185
6.6 使用引用類型和值類型管理記憶體 186
6.6.1 定義引用類型和值類型 186
6.6.2 如何在記憶體中存儲引用和值類型 187
6.6.3 類型的相等性 188
6.6.4 定義struct類型 189
6.6.5 使用record struct類型 190
6.6.6 釋放非託管資源 190
6.6.7 確保調用Dispose方法 192
6.7 使用空值 192
6.7.1 使值類型可為空 192
6.7.2 理解可空引用類型 193
6.7.3 啟用可空引用類型和不可空引用類型 193
6.7.4 聲明非空變數和參數 194
6.7.5 檢查null 195
6.8 從類繼承 196
6.8.1 擴展類以添加功能 197
6.8.2 隱藏成員 197
6.8.3 覆蓋成員 198
6.8.4 從抽象類繼承 199
6.8.5 防止繼承和覆蓋 200
6.8.6 理解多態 200
6.9 在繼承層次結構中進行類型轉換 202
6.9.1 隱式類型轉換 202
6.9.2 顯式類型轉換 202
6.9.3 避免類型轉換異常 202
6.10 繼承和擴展.NET類型 204
6.10.1 繼承異常 204
6.10.2 無法繼承時擴展類型 205
6.11 使用分析器編寫更好的代碼 207
6.12 實踐和探索 211
6.12.1 練習6.1:測試你掌握的知識 211
6.12.2 練習6.2:練習創建繼承層次結構 212
6.12.3 練習6.3:探索主題 212
6.13 本章小結 212
第7章 理解和打包.NET類型 213
7.1 .NET 6簡介 213
7.1.1 .NET Core 1.0 214
7.1.2 .NET Core 1.1 214
7.1.3 .NET Core 2.0 214
7.1.4 .NET Core 2.1 214
7.1.5 .NET Core 2.2 215
7.1.6 .NET Core 3.0 215
7.1.7 .NET Core 3.1 215
7.1.8 .NET 5.0 215
7.1.9 .NET 6.0 216
7.1.10 從.NET Core 2.0到.NET 5不斷提高性能 216
7.1.11 檢查.NET SDK以進行更新 216
7.2 了解.NET組件 216
7.2.1 程式集、包和名稱空間 217
7.2.2 微軟.NET SDK平台 217
7.2.3 理解程式集中的名稱空間和類型 218
7.2.4 NuGet包 218
7.2.5 框架 219
7.2.6 導入名稱空間以使用類型 219
7.2.7 將C#關鍵字與.NET類型相關聯 220
7.2.8 使用.NET Standard在舊平台之間共享代碼 222
7.2.9 理解不同SDK中類庫的默認值 222
7.2.10 創建.NET Standard 2.0類庫 223
7.2.11 控制.NET SDK 223
7.3 發布用於部署的代碼 224
7.3.1 創建要發布的控制台應用程式 225
7.3.2 dotnet命令 226
7.3.3 獲取關於.NET及其環境的信息 227
7.3.4 管理項目 227
7.3.5 發布自包含的應用程式 228
7.3.6 發布單檔案套用 229
7.3.7 使用app trimming系統減小應用程式的大小 230
7.4 反編譯程式集 231
7.4.1 使用Visual Studio 2022的ILSpy擴展進行反編譯 231
7.4.2 使用Visual Studio Code的ILSpy擴展進行反編譯 232
7.4.3 不能在技術上阻止反編譯 235
7.5 為NuGet分發打包自己的庫 236
7.5.1 引用NuGet包 236
7.5.2 為NuGet打包庫 237
7.5.3 使用工具探索NuGet包 240
7.5.4 測試類庫包 241
7.6 從.NET Framework移植到.NET 241
7.6.1 能移植嗎? 242
7.6.2 應該移植嗎? 242
7.6.3 .NET Framework和現代.NET之間的區別 243
7.6.4 .NET可移植性分析器 243
7.6.5 .NET升級助手 243
7.6.6 使用非.NET Standard類庫 243
7.7 使用預覽特性 245
7.7.1 需要預覽特性 245
7.7.2 啟用預覽特性 245
7.7.3 通用數學 246
7.8 實踐和探索 246
7.8.1 練習7.1:測試你掌握的知識 247
7.8.2 練習7.2:探索主題 247
7.8.3 練習7.3:探索PowerShell 247
7.9 本章小結 247
第8章 使用常見的.NET類型 248
8.1 處理數字 248
8.1.1 處理大的整數 249
8.1.2 處理複數 249
8.1.3 理解四元數 250
8.2 處理文本 250
8.2.1 獲取字元串的長度 250
8.2.2 獲取字元串中的字元 251
8.2.3 拆分字元串 251
8.2.4 獲取字元串的一部分 252
8.2.5 檢查字元串的內容 252
8.2.6 連線、格式化和其他的字元串成員方法 253
8.2.7 高效地構建字元串 254
8.3 處理日期和時間 254
8.3.1 指定日期和時間值 254
8.3.2 日期和時間的全球化 256
8.3.3 只使用日期或時間 257
8.4 模式匹配與正則表達式 258
8.4.1 檢查作為文本輸入的數字 258
8.4.2 改進正則表達式的性能 259
8.4.3 正則表達式的語法 260
8.4.4 正則表達式的例子 260
8.4.5 分割使用逗號分隔的複雜字元串 261
8.5 在集合中存儲多個對象 262
8.5.1 所有集合的公共特性 262
8.5.2 通過確保集合的容量來提高性能 264
8.5.3 理解集合的選擇 264
8.5.4 使用列表 267
8.5.5 使用字典 268
8.5.6 處理佇列 270
8.5.7 集合的排序 272
8.5.8 使用專門的集合 272
8.5.9 使用不可變集合 272
8.5.10 集合的最佳實踐 273
8.6 使用Span、索引和範圍 274
8.6.1 通過Span高效地使用記憶體 274
8.6.2 用索引類型標識位置 274
8.6.3 使用Range值類型標識範圍 274
8.6.4 使用索引、範圍和Span 275
8.7 使用網路資源 275
8.7.1 使用URI、DNS和IP位址 276
8.7.2 ping伺服器 277
8.8 處理反射和屬性 278
8.8.1 程式集的版本控制 279
8.8.2 閱讀程式集元數據 279
8.8.3 創建自定義特性 281
8.8.4 更多地使用反射 283
8.9 處理圖像 283
8.10 國際化代碼 285
8.11 實踐和探索 287
8.11.1 練習8.1:測試你掌握的知識 287
8.11.2 練習8.2:練習正則表達式 287
8.11.3 練習8.3:練習編寫擴展方法 288
8.11.4 練習8.4:探索主題 288
8.12 本章小結 288
第9章 處理檔案、流和序列化 289
9.1 管理檔案系統 289
9.1.1 處理跨平台環境和檔案系統 289
9.1.2 管理驅動器 291
9.1.3 管理目錄 292
9.1.4 管理檔案 293
9.1.5 管理路徑 294
9.1.6 獲取檔案信息 294
9.1.7 控制如何處理檔案 295
9.2 用流來讀寫 296
9.2.1 理解抽象和具體的流 296
9.2.2 寫入文本流 297
9.2.3 寫入XML流 299
9.2.4 檔案資源的釋放 300
9.2.5 壓縮流 302
9.2.6 使用Brotli算法進行壓縮 304
9.3 編碼和解碼文本 306
9.3.1 將字元串編碼為位元組數組 306
9.3.2 對檔案中的文本進行編碼和解碼 308
9.4 序列化對象圖 309
9.4.1 序列化為XML 309
9.4.2 生成緊湊的XML 311
9.4.3 反序列化XML檔案 312
9.4.4 用JSON序列化 313
9.4.5 高性能的JSON處理 314
9.5 控制JSON的處理 315
9.5.1 用於處理HTTP回響的新的JSON擴展方法 317
9.5.2 從Newtonsoft遷移到新的JSON 317
9.6 實踐和探索 318
9.6.1 練習9.1:測試你掌握的知識 318
9.6.2 練習9.2:練習序列化為XML 318
9.6.3 練習9.3:探索主題 319
9.7 本章小結 319
第10章 使用Entity Framework Core處理資料庫 320
10.1 理解現代資料庫 320
10.1.1 理解舊的實體框架 320
10.1.2 理解Entity Framework Core 321
10.1.3 使用EF Core創建控制台應用程式 321
10.1.4 使用示例關係資料庫 322
10.1.5 使用Microsoft SQL Server for Windows 322
10.1.6 為SQL Server創建Northwind示例資料庫 323
10.1.7 使用Server Explorer管理Northwind示例資料庫 324
10.1.8 使用SQLite 325
10.1.9 為SQLite創建Northwind示例資料庫 326
10.1.10 使用SQLiteStudio管理Northwind示例資料庫 326
10.2 設定EF Core 327
10.2.1 選擇EF Core數據提供程式 327
10.2.2 連線到資料庫 328
10.2.3 定義Northwind資料庫上下文類 329
10.3 定義EF Core模型 330
10.3.1 使用EF Core約定定義模型 331
10.3.2 使用EF Core註解特性定義模型 331
10.3.3 使用EF Core Fluent API定義模型 332
10.3.4 為Northwind表構建EF Core模型 333
10.3.5 向Northwind資料庫上下文類添加表 335
11.3.6 安裝dotnet-ef工具 336
10.3.7 使用現有資料庫搭建模型 336
10.3.8 配置約定前模型 340
10.4 查詢EF Core模型 340
10.4.1 過濾結果中返回的實體 342
10.4.2 過濾和排序產品 343
10.4.3 獲取生成的SQL 344
10.4.4 使用自定義日誌提供程式記錄EF Core 345
10.4.5 模式匹配與Like 349
10.4.6 定義全局過濾器 350
10.5 使用EF Core載入模式 350
10.5.1 立即載入實體 350
10.5.2 啟用延遲載入 351
10.5.3 顯式載入實體 352
10.6 使用EF Core運算元據 354
10.6.1 插入實體 354
10.6.2 更新實體 355
10.6.3 刪除實體 356
10.6.4 池化資料庫環境 357
10.7 事務 357
10.7.1 使用隔離級別控制事務 358
10.7.2 定義顯式事務 358
10.8 Code First EF Core模型 359
10.9 實踐和探索 364
10.9.1 練習10.1:測試你掌握的知識 364
10.9.2 練習10.2:練習使用不同的序列化格式導出數據 365
10.9.3 練習10.3:研究EF Core文檔 365
10.9.4 練習10.4:探索NoSQL資料庫 365
10.10 本章小結 365
第11章 使用LINQ查詢和運算元據 366
11.1 編寫LINQ表達式 366
11.1.1 LINQ的組成 366
11.1.2 使用Enumerable類構建LINQ表達式 367
11.1.3 使用Where擴展方法過濾實體 369
11.1.4 以命名方法為目標 371
11.1.5 通過刪除委託的顯式實例化來簡化代碼 371
11.1.6 以lambda表達式為目標 371
11.1.7 實體的排序 372
11.1.8 使用var或指定類型來聲明查詢 373
11.1.9 根據類型進行過濾 373
11.1.10 使用LINQ處理集合 374
11.2 使用LINQ與EF Core 376
11.2.1 構建EF Core模型 376
11.2.2 序列的篩選和排序 379
11.2.3 將序列投影到新的類型中 380
11.2.4 連線和分組序列 381
11.2.5 聚合序列 384
11.3 使用語法糖美化LINQ語法 385
11.4 使用帶有並行LINQ的多個執行緒 386
11.5 創建自己的LINQ擴展方法 388
11.6 使用LINQ to XML 391
11.6.1 使用LINQ to XML生成XML 391
11.6.2 使用LINQ to XML讀取XML 392
11.7 實踐和探索 393
11.7.1 練習11.1:測試你掌握的知識 393
11.7.2 練習11.2:練習使用LINQ進行查詢 393
11.7.3 練習11.3:探索主題 394
11.8 本章小結 394
第12章 使用多任務提高性能和可伸縮性 395
12.1 理解進程、執行緒和任務 395
12.2 監控性能和資源使用情況 396
12.2.1 評估類型的效率 396
12.2.2 監控性能和記憶體使用情況 396
12.2.3 測量處理字元串的效率 399
12.2.4 使用Benchmark.NET監控性能和記憶體 400
12.3 異步運行任務 403
12.3.1 同步執行多個操作 403
12.3.2 使用任務異步執行多個操作 405
12.3.3 等待任務 406
12.3.4 繼續執行另一項任務 407
12.3.5 嵌套任務和子任務 408
12.3.6 將任務包裝在其他對象周圍 409
12.4 同步訪問共享資源 410
12.4.1 從多個執行緒訪問資源 410
12.4.2 對conch套用互斥鎖 412
12.4.3 事件的同步 414
12.4.4 使CPU操作原子化 415
12.4.5 套用其他類型的同步 415
12.5 理解async和await 416
12.5.1 提高控制台應用程式的回響能力 416
12.5.2 改進GUI應用程式的回響能力 417
12.5.3 改進Web應用程式和Web服務的可伸縮性 420
12.5.4 支持多任務處理的常見類型 420
12.5.5 在catch塊中使用await關鍵字 420
12.5.6 使用async流 420
12.6 實踐和探索 421
12.6.1 練習12.1:測試你掌握的知識 422
12.6.2 練習12.2:探索主題 422
12.7 本章小結 422
第13章 C#和.NET的實際套用 423
13.1 理解C#和.NET的套用模型 423
13.1.1 使用ASP.NET Core構建網站 423
13.1.2 構建Web和其他服務 425
13.1.3 構建移動和桌面套用 425
13.1.4 .NET MAUI的替代品 426
13.2 ASP.NET Core的新特性 426
13.2.1 ASP.NET Core 1.0 427
13.2.2 ASP.NET Core 1.1 427
13.2.3 ASP.NET Core 2.0 427
13.2.4 ASP.NET Core 2.1 427
13.2.5 ASP.NET Core 2.2 428
13.2.6 ASP.NET Core 3.0 428
13.2.7 ASP.NET Core 3.1 428
13.2.8 Blazor WebAssembly 3.2 428
13.2.9 ASP.NET Core 5.0 428
13.2.10 ASP.NET Core 6.0 429
13.3 構建Windows專用的桌面應用程式 429
13.3.1 理解舊的Windows應用程式平台 429
13.3.2 理解現代.NET對舊Windows平台的支持 430
13.4 結構化項目 430
13.5 使用其他項目模板 431
13.6 為Northwind資料庫建立實體數據模型 433
13.6.1 使用SQLite創建實體模型類庫 433
13.6.2 使用SQL Server創建實體模型類庫 440
13.7 實踐和探索 442
13.7.1 練習13.1:測試你掌握的知識 442
13.7.2 練習13.2:探索主題 442
13.8 本章小結 442
第14章 使用ASP.NET Core Razor Pages構建網站 444
14.1 了解Web開發 444
14.1.1 HTTP 444
14.1.2 使用Google Chrome瀏覽器發出HTTP請求 446
14.1.3 客戶端Web開發技術 448
14.2 了解ASP.NET Core 448
14.2.1 傳統的ASP.NET與現代的ASP.NET Core 449
14.2.2 創建ASP.NET Core項目 449
14.2.3 測試和保護網站 451
14.2.4 控制託管環境 454
14.2.5 分離服務和管道的配置 456
14.2.6 使網站能夠提供靜態內容 457
14.3 了解ASP.NET Core Razor Pages 459
14.3.1 啟用Razor Pages 459
14.3.2 給Razor Pages添加代碼 460
14.3.3 通過Razor Pages使用共享布局 461
14.3.4 使用後台代碼檔案與Razor Pages 463
14.4 使用Entity Framework Core與ASP.NET Core 465
14.4.1 將Entity Framework Core配置為服務 465
14.4.2 使用Razor Pages運算元據 467
14.4.3 將依賴服務注入Razor Pages中 468
14.5 使用Razor類庫 469
14.5.1 創建Razor類庫 469
14.5.2 禁用Visual Studio Code的Compact Folders功能 469
14.5.3 使用EF Core實現員工特性 470
14.5.4 實現分部視圖以顯示單個員工 472
14.5.5 使用和測試Razor類庫 473
14.6 配置服務和HTTP請求管道 473
14.6.1 端點路由 474
14.6.2 檢查項目中的端點路由配置 474
14.6.3 總結關鍵的中間件擴展方法 477
14.6.4 可視化HTTP管道 478
14.6.5 實現匿名內聯委託作為中間件 478
14.7 實踐和探索 479
14.7.1 練習14.1:測試你掌握的知識 479
14.7.2 練習14.2:練習建立數據驅動的網頁 480
14.7.3 練習14.3:練習為控制台應用程式構建Web頁面 480
14.7.4 練習14.4:探索主題 480
14.8 本章小結 480
第15章 使用MVC模式構建網站 481
15.1 設定ASP.NET Core MVC網站 481
15.1.1 創建ASP.NET Core MVC網站 481
15.1.2 為SQL Server LocalDB創建認證資料庫 482
15.1.3 探索默認的ASP.NET Core MVC網站 483
15.1.4 審查MVC網站項目結構 484
15.1.5 回顧ASP.NET Core Identity資料庫 486
15.2 探索ASP.NET Core MVC網站 487
15.2.1 了解ASP.NET Core MVC的啟動 487
15.2.2 理解MVC使用的默認路由 489
15.2.3 理解控制器和操作 489
15.2.4 理解視圖搜尋路徑約定 492
15.2.5 了解記錄 493
15.2.6 過濾器 493
15.2.7 實體和視圖模型 498
15.2.8 視圖 500
15.3 自定義ASP.NET Core MVC網站 502
15.3.1 自定義樣式 503
15.3.2 設定類別圖像 503
15.3.3 Razor語法 503
15.3.4 定義類型化視圖 504
15.3.5 測試自定義首頁 506
15.3.6 使用路由值傳遞參數 507
15.3.7 模型綁定程式 509
15.3.8 驗證模型 512
15.3.9 視圖輔助方法 514
15.4 查詢資料庫和使用顯示模板 516
15.5 使用異步任務提高可伸縮性 518
15.6 實踐與探索 519
15.6.1 練習15.1:測試你掌握的知識 519
15.6.2 練習15.2:通過實現類別詳細信息頁面來練習實現MVC 520
15.6.3 練習15.3:理解和實現異步操作方法以提高可伸縮性 520
15.6.4 練習15.4:單元測試MVC控制器 520
15.6.5 練習15.5:探索主題 520
15.7 本章小結 520
第16章 構建和消費Web服務 521
16.1 使用ASP.NET Core Web API構建Web服務 521
16.1.1 理解Web服務縮寫詞 521
16.1.2 理解Web API的HTTP請求和回響 522
16.1.3 創建ASP.NET Core Web API項目 524
16.1.4 檢查Web服務的功能 526
16.1.5 為Northwind示例資料庫創建Web服務 527
16.1.6 為實體創建數據存儲庫 529
16.1.7 實現Web API控制器 531
16.1.8 配置客戶存儲庫和Web API控制器 533
16.1.9 指定問題的細節 536
16.1.10 控制XML序列化 537
16.2 解釋和測試Web服務 537
16.2.1 使用瀏覽器測試GET請求 538
16.2.2 使用REST Client擴展測試HTTP請求 539
16.2.3 啟用Swagger 541
16.2.4 使用Swagger UI測試請求 542
16.2.5 啟用HTTP logging 546
16.3 使用HTTP客戶端消費Web服務 547
16.3.1 了解HttpClient類 547
16.3.2 使用HttpClientFactory配置HTTP客戶端 548
16.3.3 在控制器中以JSON的形式獲取客戶 548
16.3.4 支持跨源資源共享 550
16.4 為Web服務實現高級功能 552
16.4.1 實現健康檢查API 552
16.4.2 實現Open API分析器和約定 552
16.4.3 實現臨時故障處理 553
16.4.4 添加HTTP安全標頭 553
16.5 使用最少的API構建Web服務 554
16.5.1 使用最少的API構建天氣服務 555
16.5.2 測試最小天氣服務 556
16.5.3 向Northwind網站主頁添加天氣預報 556
16.6 實踐和探索 559
16.6.1 練習16.1:測試你掌握的知識 559
16.6.2 練習16.2:練習使用HttpClient創建和刪除客戶 559
16.6.3 練習16.3:探索主題 559
16.7 本章小結 559
第17章 使用Blazor構建用戶界面 560
17.1 理解Blazor 560
17.1.1 JavaScript 560
17.1.2 Silverlight——使用外掛程式的C#和.NET 561
17.1.3 WebAssembly——Blazor的目標 561
17.1.4 理解Blazor託管模型 561
17.1.5 理解Blazor組件 562
17.1.6 比較Blazor和Razor 562
17.2 比較Blazor項目模板 563
17.2.1 Blazor伺服器項目模板 563
17.2.2 理解到頁面組件的Blazor路由 568
17.2.3 運行Blazor伺服器項目模板 570
17.2.4 查看Blazor WebAssembly項目模板 571
17.3 使用Blazor伺服器構建組件 575
17.3.1 定義和測試簡單的組件 575
17.3.2 轉換成可路由的頁面組件 576
17.3.3 將實體放入組件 576
17.4 為Blazor組件抽象服務 579
17.4.1 使用EditForm組件定義表單 581
17.4.2 構建和使用客戶表單組件 581
17.4.3 測試客戶表單組件 584
17.5 使用Blazor WebAssembly構建組件 585
17.5.1 為Blazor WebAssembly配置伺服器 586
17.5.2 為Blazor WebAssembly配置客戶端 588
17.5.3 測試Blazor WebAssembly組件和服務 590
17.6 改進Blazor WebAssembly應用程式 591
17.6.1 啟用Blazor WebAssembly AOT 591
17.6.2 Web App的漸進式支持 593
17.6.3 了解Blazor WebAssembly的瀏覽器兼容性分析程式 594
17.6.4 在類庫中共享Blazor組件 595
17.6.5 使用JavaScript互動操作 596
17.6.6 Blazor組件庫 598
17.7 實踐和探索 598
17.7.1 練習17.1:測試你掌握的知識 599
17.7.2 練習17.2:練習創建組件 599
17.7.3 練習17.3:通過創建國家導航項進行練習 599
17.7.4 練習17.4:探索主題 599
17.8 本章小結 600
第18章 構建和消費專業服務 601
18.1 了解專業服務技術 601
18.2 使用OData將數據公開為Web服務 602
18.2.1 理解OData 602
18.2.2 構建一個支持OData的Web服務 602
18.2.3 創建和測試OData控制器 606
18.2.4 使用REST客戶端測試OData控制器 607
18.2.5 查詢OData模型 608
18.2.6 記錄OData請求 610
18.2.7 OData控制器的版本控制 612
18.2.8 使用POST啟用實體插入 613
18.2.9 為OData構建客戶端 615
18.3 使用GraphQL將數據公開為服務 617
18.3.1 理解GraphQL 617
18.3.2 構建支持GraphQL的服務 618
18.3.3 為Hello World定義GraphQL模式 619
18.3.4 為EF Core模型定義GraphQL模式 621
18.3.5 利用Northwind探索GraphQL查詢 624
18.3.6 理解GraphQL變化和訂閱 626
18.3.7 為GraphQL構建客戶機 626
18.4 使用gRPC實現服務 629
18.4.1 理解gRPC 629
18.4.2 構建gRPC服務 629
18.4.3 構建gRPC客戶端 631
18.4.4 針對gRPC服務測試gRPC客戶端 633
18.4.5 為EF Core模型實現gRPC服務 633
18.4.6 為EF Core模型實現gRPC客戶端 635
18.5 使用SignalR實現實時通信 637
18.5.1 了解網路實時通信的歷史 637
18.5.2 使用SignalR構建實時通信服務 638
18.5.3 測試聊天功能 644
18.5.4 建立控制台套用聊天客戶端 646
18.6 使用Azure Functions實現無伺服器服務 648
18.6.1 理解Azure Functions 649
18.6.2 為Azure Functions建立本地開發環境 650
18.6.3 構建一個Azure Functions項目用於本地運行 650
18.6.4 評估這個項目 652
18.6.5 實現函式 653
18.6.6 測試函式 654
18.6.7 發布Azure Functions項目到雲 655
18.6.8 清理Azure資源 657
18.7 了解身份服務 657
18.8 專門服務的選擇摘要 658
18.9 實踐和探索 658
18.9.1 練習18.1:測試你掌握的知識 658
18.9.2 練習18.2:探索主題 659
18.10 本章小結 659
第19章 使用.NET MAUI構建移動和桌面應用程式 660
19.1 理解.NET MAUI延遲 661
19.2 理解XAML 661
19.2.1 使用XAML簡化代碼 661
19.2.2 選擇常見的控制項 662
19.2.3 理解標記擴展 663
19.3 了解.NET MAUI 663
19.3.1 開發工具的移動優先、雲優先 663
19.3.2 了解額外的功能 664
19.3.3 理解.NET MAUI用戶界面組件 666
19.3.4 理解.NET MAUI處理程式 667
19.3.5 編寫特定於平台的代碼 667
19.4 使用.NET MAUI構建移動和桌面套用 668
19.4.1 創建用於本地套用測試的虛擬Android設備 668
19.4.2 創建.NET MAUI解決方案 669
19.4.3 使用雙向數據綁定創建視圖模型 671
19.4.4 為客戶列表和客戶詳細信息創建視圖 674
19.4.5 實現客戶列表視圖 674
19.4.6 實現客戶詳情視圖 677
19.4.7 設定手機套用的主界面 679
19.4.8 測試移動應用程式 679
19.5 從移動應用程式中消費Web服務 681
19.5.1 配置Web服務以允許不安全的請求 681
19.5.2 從Web服務中獲取客戶 682
19.6 實踐和探索 683
19.6.1 練習19.1:測試你掌握的知識 683
19.6.2 練習19.2:探索主題 684
19.7 本章小結 684
第20章 保護數據和應用程式 685
20.1 理解數據保護術語 685
20.1.1 密鑰和密鑰的大小 686
20.1.2 IV和塊大小 686
20.1.3 salt 687
20.1.4 生成密鑰和IV 687
20.2 加密和解密數據 688
20.3 哈希數據 692
20.4 簽名數據 696
20.5 生成隨機數 699
20.5.1 為遊戲和類似應用程式生成隨機數 699
20.5.2 為密碼生成隨機數 699
20.6 用戶的身份驗證和授權 700
20.6.1 身份驗證和授權機制 701
20.6.2 實現身份驗證和授權 703
20.6.3 保護應用程式功能 705
20.6.4 真實世界的身份驗證和授權 706
20.7 實踐和探索 706
20.7.1 練習20.1:測試你掌握的知識 707
20.7.2 練習20.2:練習使用加密和哈希方法保護數據 707
20.7.3 練習20.3:練習使用解密保護數據 707
20.7.4 練習20.4:探索主題 707
20.8 本章小結 708
—以下部分通過二維碼掃描獲取—
附錄A 練習題答案 709
後記 726