C# 高級編程, 12/e Professional C# and .NET

[奧]克裡斯琴·內格爾(Chrisitian Nagel) 著 李銘 譯

  • C# 高級編程, 12/e-preview-1
  • C# 高級編程, 12/e-preview-2
  • C# 高級編程, 12/e-preview-3
C# 高級編程, 12/e-preview-1

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

商品描述

? 為需要新的庫和工具的高級開發人員介紹了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