被譽為“C#聖經”的經典著作,因語言生動流暢、剖析深入、涵蓋全面而廣受推崇,暢銷不衰。曾經獲得Referenceware編程圖書大獎,併入選Jolt大獎提名。探討了C#語言和.NET平台的各種特性,包括面向對象編程,委託、事件和Lambda表達式的關係,LINQ編程,多執行緒、並行和異步編程,ADO.NET、WCF、WF、WPF等技術。新版更透徹闡述了C#5.0和.NET 4.5的新功能。
基本介紹
- 書名:精通C#
- 作者:美 Andrew Troelsen
- 譯者:姚琪琳 朱曄 肖逵 張大磊 王少葵 范睿等
- ISBN:9787115321817
- 類別:程式設計
- 頁數:1192
- 定價:159.00元
- 出版社:人民郵電出版社
- 出版時間:2013-7-1
- 裝幀:平裝
- 開本:大16開
- 用紙:膠版紙
- 印次:1
- 版次:1
- 字數:1813000
內容介紹
作者介紹
作品目錄
第一部分 C#與.NET平台
第1章 .NET之道 2
1.1 初識.NET平台 2
1.2 .NET平台構造塊(CLR、CTS和CLS)簡介 3
1.2.1 基礎類庫的作用 3
1.2.2 C#的優點 4
1.2.3 託管代碼與非託管代碼 5
1.3 其他支持.NET的程式語言 5
1.4 .NET程式集概覽 7
1.4.1 CIL的作用 8
1.4.2 .NET類型元數據的作用 10
1.4.3 程式集清單的作用 11
1.5 CTS 12
1.5.1 CTS類類型 12
1.5.2 CTS接口類型 12
1.5.3 CTS結構類型 13
1.5.4 CTS枚舉類型 13
1.5.5 CTS委託類型 13
1.5.6 CTS類型成員 14
1.5.7 內建的CTS數據類型 14
1.6 CLS 15
1.7 CLR 16
1.8 程式集/命名空間/類型的區別 17
1.8.1 Microsoft根命名空間的作用 20
1.8.2 以編程方式訪問命名空間 20
1.8.3 引用外部程式集 21
1.9 使用ildasm.exe探索程式集 22
1.9.1 查看CIL代碼 23
1.9.2 查看類型元數據 23
1.9.3 查看程式集元數據(即清單) 24
1.10 .NET的平台無關性 24
1.11 Windows 8應用程式簡介 25
1.11.1 構建Windows 8應用程式 26
1.11.2 .NET在Windows 8中的作用 27
1.12 小結 28
第2章 構建C#應用程式 29
2.1 .NET Framework 4.5 SDK的作用 29
2.2 用csc.exe構建C#應用程式 30
2.2.1 指定輸入輸出目標 31
2.2.2 引用外部程式集 32
2.2.3 引用多個外部程式集 33
2.2.4 編譯多個源檔案 33
2.2.5 使用C#回響檔案 34
2.3 使用Notepad++構建.NET應用程式 35
2.4 使用SharpDevelop構建.NET應用程式 36
2.5 使用Visual C# Express構建.NET應用程式 38
2.6 使用Visual Studio構建.NET應用程式 39
2.6.1 Visual Studio的獨特功能 39
2.6.2 使用New Project對話框指向.NET Framework 40
2.6.3 解決方案資源管理器 40
2.6.4 Class View工具 42
2.6.5 Object Browser工具 43
2.6.6 集成對代碼重構的支持 43
2.6.7 代碼擴展和圍繞技術 45
2.6.8 可視化Class Designer 47
2.6.9 集成的.NET Framework 4.5 SDK文檔系統 50
2.7 小結 51
第二部分 C#核心編程結構
第3章 C#核心編程結構Ⅰ 54
3.1 一個簡單的C#程式 54
3.1.1 Main()方法的其他形式 55
3.1.2 指定應用程式錯誤代碼 56
3.1.3 處理命令行參數 57
3.1.4 使用Visual Studio指定命令行參數 59
3.2 有趣的題外話:System.Environment類的其他成員 59
3.3 System.Console類 61
3.3.1 使用Console類進行基本的輸入和輸出 61
3.3.2 格式化控制台輸出 62
3.3.3 格式化數值數據 63
3.3.4 在控制台應用程式外格式化數值數據 64
3.4 系統數據類型和相應的C#關鍵字 64
3.4.1 變數聲明和初始化 65
3.4.2 內建數據類型與new操作符 67
3.4.3 數據類型類的層次結構 67
3.4.4 數值數據類型的成員 69
3.4.5 System.Boolean的成員 69
3.4.6 System.Char的成員 69
3.4.7 從字元串數據中解析數值 70
3.4.8 System.DateTime和System.TimeSpan 70
3.4.9 System.Numerics.dll程式集 71
3.5 使用字元串數據 72
3.5.1 基本的字元串操作 73
3.5.2 字元串拼接 73
3.5.3 轉義字元 74
3.5.4 定義逐字字元串 75
3.5.5 字元串和相等性 75
3.5.6 字元串是不可變的 76
3.5.7 System.Text.StringBuilder類型 77
3.6 窄化和寬化數據類型轉換 78
3.6.1 checked關鍵字 80
3.6.2 設定項目級別的溢出檢測 81
3.6.3 unchecked關鍵字 82
3.7 隱式類型本地變數 82
3.7.1 隱式類型變數的限制 84
3.7.2 隱式類型數據是強類型數據 84
3.7.3 隱式類型本地變數的用途 85
3.8 C#疊代結構 86
3.8.1 for循環 86
3.8.2 foreach循環 87
3.8.3 while和do/while循環結構 87
3.9 條件結構和關係/相等操作符 88
3.9.1 if/else語句 88
3.9.2 關係/相等操作符 88
3.9.3 邏輯操作符 89
3.9.4 switch語句 89
3.10 小結 91
第4章 C#核心編程結構Ⅱ 92
4.1 方法和參數修飾符 92
4.1.1 默認的參數傳遞行為 93
4.1.2 out修飾符 94
4.1.3 ref修飾符 95
4.1.4 params修飾符 96
4.1.5 定義可選參數 97
4.1.6 使用命名參數調用方法 98
4.1.7 成員重載 99
4.2 C#數組 101
4.2.1 C#數組初始化語法 102
4.2.2 隱式類型本地數組 103
4.2.3 定義object數組 103
4.2.4 使用多維數組 104
4.2.5 數組作為參數(和返回值) 105
4.2.6 System.Array基類 106
4.3 枚舉類型 107
4.3.1 控制枚舉的底層存儲 108
4.3.2 聲明枚舉變數 109
4.3.3 System.Enum類型 110
4.3.4 動態獲取枚舉的名稱/值對 110
4.4 結構類型 112
4.5 值類型和引用類型 115
4.5.1 值類型、引用類型和賦值操作符 116
4.5.2 包含引用類型的值類型 117
4.5.3 按值傳遞引用類型 119
4.5.4 按引用傳遞引用類型 120
4.5.5 值類型和引用類型:最後的細節 121
4.6 C#可空類型 122
4.6.1 使用可空類型 123
4.6.2 ??操作符 124
4.7 小結 124
第三部分 C#面向對象編程
第5章 封裝 126
5.1 C#類類型 126
5.2 構造函式 129
5.2.1 默認構造函式的作用 129
5.2.2 定義自定義的構造函式 130
5.2.3 再談默認構造函式 131
5.3 this關鍵字的作用 132
5.3.1 使用this進行串聯構造函式調用 133
5.3.2 觀察構造函式流程 135
5.3.3 再談可選參數 137
5.4 static關鍵字 138
5.4.1 定義靜態數據 138
5.4.2 定義靜態方法 140
5.4.3 定義靜態構造函式 141
5.4.4 定義靜態類 143
5.5 定義OOP的支柱 144
5.5.1 封裝的作用 144
5.5.2 繼承的作用 144
5.5.3 多態的作用 146
5.6 C#訪問修飾符 147
5.6.1 默認的訪問修飾符 148
5.6.2 訪問修飾符和嵌套類型 148
5.7 第一個支柱:C#的封裝服務 149
5.7.1 使用傳統的訪問方法和修改方法執行封裝 149
5.7.2 使用.NET屬性進行封裝 151
5.7.3 使用類的屬性 154
5.7.4 唯讀和只寫屬性 155
5.7.5 靜態屬性 156
5.8 自動屬性 156
5.8.1 與自動屬性互動 158
5.8.2 關於自動屬性和默認值 158
5.9 對象初始化語法 160
5.9.1 使用初始化語法調用自定義構造函式 161
5.9.2 初始化內部類型 162
5.10 常量數據 163
5.10.1 唯讀欄位 164
5.10.2 靜態唯讀欄位 165
5.11 分部類型 165
5.12 小結 167
第6章 繼承和多態 168
6.1 繼承的基本機制 168
6.1.1 指定既有類的父類 169
6.1.2 多個基類 170
6.1.3 sealed關鍵字 171
6.2 回顧Visual Studio類關係圖 172
6.3 OOP的第二個支柱:繼承 173
6.3.1 使用base關鍵字控制基類的創建 174
6.3.2 家族的秘密:protected關鍵字 176
6.3.3 增加密封類 177
6.4 包含/委託編程 178
6.5 OOP的第三個支柱:C#的多態支持 180
6.5.1 virtual和override關鍵字 181
6.5.2 使用Visual Studio IDE重寫虛方法 183
6.5.3 密封虛成員 184
6.5.4 抽象類 184
6.5.5 構建多態接口 186
6.5.6 成員投影 189
6.6 基類/派生類的轉換規則 191
6.6.1 C#的as關鍵字 192
6.6.2 C#的is關鍵字 193
6.7 超級父類:System.Object 193
6.7.1 重寫System.Object.ToString() 196
6.7.2 重寫System.Object.Equals() 196
6.7.3 重寫System.Object.GetHashCode() 197
6.7.4 測試修改後的Person類 198
6.7.5 System.Object的靜態成員 199
6.8 小結 199
第7章 結構化異常處理 200
7.1 錯誤、bug與異常 200
7.2 .NET異常處理的作用 201
7.2.1 .NET異常處理的四要素 202
7.2.2 System.Exception基類 202
7.3 最簡單的例子 203
7.3.1 引發普通的異常 205
7.3.2 捕獲異常 206
7.4 配置異常的狀態 207
7.4.1 TargetSite屬性 207
7.4.2 StackTrace屬性 208
7.4.3 HelpLink屬性 208
7.4.4 Data屬性 209
7.5 系統級異常 211
7.6 應用程式級異常 211
7.6.1 構建自定義異常,第一部分 212
7.6.2 構建自定義異常,第二部分 213
7.6.3 構建自定義異常,第三部分 214
7.7 處理多個異常 215
7.7.1 通用的catch語句 217
7.7.2 再次引發異常 218
7.7.3 內部異常 218
7.7.4 finally塊 219
7.8 誰在引發什麼異常 220
7.9 未處理異常的後果 220
7.10 使用Visual Studio調試未處理的異常 221
7.11 小結 222
第8章 接口 223
8.1 接口類型 223
8.2 定義自定義接口 226
8.3 實現接口 227
8.4 在對象級別調用接口成員 229
8.4.1 獲取接口引用:as關鍵字 230
8.4.2 獲取接口引用:is關鍵字 230
8.5 接口作為參數 231
8.6 接口作為返回值 233
8.7 接口類型數組 233
8.8 使用Visual Studio實現接口 234
8.9 顯式接口實現 235
8.10 設計接口層次結構 238
8.11 構建可枚舉類型(IEnumerable和IEnumerator) 241
8.11.1 用yield關鍵字構建疊代器方法 243
8.11.2 構建命名疊代器 244
8.12 構建可克隆的對象(ICloneable) 245
8.13 構建可比較的對象(IComparable) 249
8.13.1 指定多個排序順序 252
8.13.2 自定義屬性、自定義排序類型 253
8.14 小結 253
第四部分 高級C#編程結構
第9章 集合與泛型 256
9.1 集合類的動機 256
9.1.1 System.Collections命名空間 257
9.1.2 System.Collections.Specialized命名空間 259
9.2 非泛型集合的問題 260
9.2.1 性能問題 260
9.2.2 類型安全問題 263
9.2.3 初識泛型集合 265
9.3 泛型類型參數的作用 266
9.3.1 為泛型類/結構指定類型參數 267
9.3.2 為泛型成員指定類型參數 268
9.3.3 為泛型接口指定類型參數 269
9.4 System.Collections.Generic命名空間 270
9.4.1 集合初始化語法 271
9.4.2 使用List<T>類 272
9.4.3 使用Stack<T>類 273
9.4.4 使用Queue<T>類 274
9.4.5 使用SortedSet<T>類 275
9.5 System.Collections.ObjectModel命名空間 277
9.6 創建自定義泛型方法 279
9.7 創建自定義泛型結構和類 282
9.8 類型參數的約束 284
9.8.1 使用where關鍵字的示例 284
9.8.2 操作符約束的不足 285
9.9 小結 286
第10章 委託、事件和Lambda表達式 287
10.1 .NET委託類型 287
10.1.1 在C#中定義委託類型 288
10.1.2 System.MulticastDelegate與System.Delegate基類 290
10.2 最簡單的委託示例 291
10.3 使用委託傳送對象狀態通知 293
10.3.1 支持多路廣播 296
10.3.2 從委託的調用列表中移除成員 297
10.3.3 方法組轉換語法 298
10.4 泛型委託 300
10.5 C#事件 303
10.5.1 event關鍵字 304
10.5.2 揭開事件的神秘面紗 305
10.5.3 監聽傳入的事件 306
10.5.4 使用Visual Studio簡化事件註冊 307
10.5.5 創建自定義的事件參數 308
10.5.6 泛型EventHandler<T>委託 309
10.6 C#匿名方法 310
10.7 Lambda表達式 313
10.7.1 剖析Lambda表達式 315
10.7.2 使用多個語句處理參數 316
10.7.3 含有多個(或零個)參數的Lambda表達式 317
10.7.4 使用Lambda表達式重新編寫CarEvents示例 318
10.8 小結 319
第11章 高級C#語言特性 320
11.1 索引器方法 320
11.1.1 使用字元串值索引對象 322
11.1.2 重載索引器方法 323
11.1.3 多維的索引器 323
11.1.4 在接口類型上定義索引器 324
11.2 操作符重載 325
11.2.1 重載二元操作符 325
11.2.2 +=與-=操作符 327
11.2.3 重載一元操作符 328
11.2.4 重載相等操作符 329
11.2.5 重載比較操作符 329
11.2.6 操作符重載的最後思考 330
11.3 自定義類型轉換 331
11.3.1 回顧:數值轉換 331
11.3.2 回顧:相關的類類型間的轉換 331
11.3.3 創建自定義轉換例程 332
11.3.4 Square類型的其他顯式轉換 334
11.3.5 定義隱式轉換例程 335
11.4 擴展方法 336
11.4.1 定義擴展方法 336
11.4.2 在實例層次上調用擴展方法 337
11.4.3 導入擴展方法 338
11.4.4 擴展方法的智慧型感知 339
11.4.5 擴展實現了指定接口的類型 339
11.5 匿名類型 340
11.5.1 定義匿名類型 341
11.5.2 匿名類型的內部表示方式 342
11.5.3 方法ToString()和GetHashCode()的實現 343
11.5.4 匿名類型的相等語義 344
11.5.5 包含匿名類型的匿名類型 345
11.6 指針類型 346
11.6.1 unsafe關鍵字 347
11.6.2 *和&操作符 348
11.6.3 不安全(與安全)交換功能 349
11.6.4 通過指針訪問欄位 350
11.6.5 stackalloc關鍵字 350
11.6.6 使用fixed關鍵字固定類型 351
11.6.7 sizeof關鍵字 352
11.7 小結 352
第12章 LINQ to Object 353
12.1 LINQ特有的編程結構 353
12.1.1 隱式類型本地變數 354
12.1.2 對象和集合初始化語法 354
12.1.3 Lambda表達式 355
12.1.4 擴展方法 355
12.1.5 匿名類型 356
12.2 LINQ的作用 356
12.2.1 LINQ表達式是強類型的 357
12.2.2 核心LINQ程式集 357
12.3 將LINQ查詢套用於原始數組 358
12.3.1 再一次,不使用LINQ 359
12.3.2 反射LINQ結果集 360
12.3.3 LINQ和隱式類型本地變數 361
12.3.4 LINQ和擴展方法 362
12.3.5 延遲執行的作用 363
12.3.6 立即執行的作用 364
12.4 返回LINQ查詢的結果 365
12.5 將LINQ查詢套用到集合對象 367
12.5.1 訪問包含的子對象 367
12.5.2 將LINQ查詢套用於非泛型集合 368
12.5.3 使用OfType<T>()篩選數據 369
12.6 C# LINQ查詢操作符 369
12.6.1 基本的選擇語法 371
12.6.2 獲取數據子集 371
12.6.3 投影新數據類型 372
12.6.4 使用Enumerable獲取總數 373
12.6.5 反轉結果集 373
12.6.6 對表達式進行排序 374
12.6.7 維恩圖工具 374
12.6.8 移除重複 375
12.6.9 LINQ聚合操作 376
12.7 LINQ查詢語句的內部表示 376
12.7.1 用查詢操作符建立查詢表達式(複習) 377
12.7.2 使用Enumerable類型和Lambda表達式來建立查詢表達式 377
12.7.3 使用Enumerable類型和匿名方法來建立查詢表達式 379
12.7.4 用Enumerable類型和原始委託建立查詢表達式 379
12.8 小結 380
第13章 對象的生命周期 381
13.1 類、對象和引用 381
13.2 對象生命周期的基礎 382
13.2.1 CIL的new指令 383
13.2.2 將對象引用設定為空 384
13.3 應用程式根的作用 385
13.4 對象的代 386
13.5 .NET 1.0 至.NET 3.5的並發垃圾回收 387
13.6 .NET 4.0及後續版本 387
13.7 System.GC類型 388
13.8 構建可終結對象 391
13.8.1 重寫System.Object.Finalize() 392
13.8.2 終結過程的細節 393
13.9 構建可處置對象 394
13.10 構建可終結類型和可處置類型 397
13.11 延遲對象實例化 400
13.12 小結 403
第五部分 用.NET程式集編程
第14章 .NET程式集入門 406
14.1 定義自定義命名空間 406
14.1.1 使用完全限定名解決命名衝突 408
14.1.2 使用別名解決命名衝突 409
14.1.3 創建嵌套的命名空間 410
14.1.4 Visual Studio 的默認命名空間 411
14.2 .NET程式集的作用 412
14.2.1 程式集促進代碼重用 412
14.2.2 程式集確定類型邊界 412
14.2.3 程式集是可版本化的單元 412
14.2.4 程式集是自描述的 413
14.2.5 程式集是可配置的 413
14.3 .NET程式集的格式 413
14.3.1 Windows檔案首部 413
14.3.2 CLR檔案首部 414
14.3.3 CIL代碼、類型元數據和程式集清單 415
14.3.4 可選的程式集資源 415
14.4 構建和使用自定義類庫 416
14.4.1 清單 418
14.4.2 CIL 421
14.4.3 類型元數據 421
14.4.4 構建C#客戶端應用程式 422
14.4.5 構建Visual Basic客戶端應用程式 424
14.4.6 實現跨語言繼承 425
14.5 私有程式集 425
14.5.1 私有程式集的標識 426
14.5.2 探測過程 426
14.5.3 配置私有程式集 427
14.5.4 App.Config檔案 428
14.6 共享程式集 430
14.6.1 全局程式集快取 430
14.6.2 強名稱 431
14.6.3 在命令行生成強名稱 432
14.6.4 使用Visual Studio為程式集賦予強名稱 434
14.6.5 在GAC中安裝強名稱的程式集 436
14.7 使用共享程式集 437
14.8 配置共享程式集 439
14.8.1 凍結當前的共享程式集 439
14.8.2 構建共享程式集2.0.0.0版本 440
14.8.3 動態重定向到共享程式集的特定版本 441
14.9 發行者策略程式集 443
14.10 <codeBase>元素 444
14.11 System.Configuration命名空間 446
14.12 配置檔案架構文檔 447
14.13 小結 448
第15章 類型反射、晚期綁定和基於特性的編程 449
15.1 類型元數據的必要性 449
15.1.1 查看(部分)EngineState枚舉的元數據 450
15.1.2 查看(部分)Car類型的元數據 451
15.1.3 研究TypeRef 452
15.1.4 記錄定義的程式集 452
15.1.5 記錄引用的程式集 453
15.1.6 記錄字元串字面量 453
15.2 反射 454
15.2.1 System.Type類 454
15.2.2 使用System.Object.GetType()得到Type引用 455
15.2.3 使用typeof()得到Type引用 455
15.2.4 使用System.Type.GetType()得到Type引用 455
15.3 構建自定義的元數據查看器 456
15.3.1 反射方法 456
15.3.2 反射欄位和屬性 457
15.3.3 反射實現的接口 457
15.3.4 顯示其他信息 458
15.3.5 實現Main() 458
15.3.6 反射泛型類型 460
15.3.7 反射方法參數和返回值 460
15.4 動態載入程式集 461
15.5 反射共享程式集 464
15.6 晚期綁定 465
15.6.1 System.Activator類 466
15.6.2 調用沒有參數的方法 467
15.6.3 調用有參數的方法 468
15.7 .NET特性的作用 469
15.7.1 特性的使用者 470
15.7.2 在C#中使用特性 470
15.7.3 C#特性簡化符號 471
15.7.4 為特性指定構造參數 472
15.7.5 Obsolete特性 472
15.8 構建自定義特性 473
15.8.1 套用自定義特性 473
15.8.2 命名屬性語法 474
15.8.3 限制特性使用 474
15.9 程式集級別特性 475
15.10 使用早期綁定反射特性 477
15.11 使用晚期綁定反射特性 478
15.12 反射、晚期綁定和自定義特性的使用背景 479
15.13 構建可擴展的應用程式 480
15.13.1 構建CommonSnappable-Types.dll 480
15.13.2 構建C#外掛程式 481
15.13.3 構建Visual Basic外掛程式 482
15.13.4 構建可擴展的Windows Forms應用程式 482
15.14 小結 485
第16章 動態類型和動態語言運行時 486
16.1 dynamic關鍵字的作用 486
16.1.1 調用動態聲明的數據的成員 488
16.1.2 Microsoft.CSharp.dll程式集的作用 489
16.1.3 dynamic關鍵字的作用域 490
16.1.4 dynamic關鍵字的限制 491
16.1.5 dynamic關鍵字的實際用途 491
16.2 DLR的作用 492
16.2.1 表達式樹的作用 492
16.2.2 System.Dynamic命名空間的作用 493
16.2.3 表達式樹的動態運行時查找 493
16.3 使用動態類型簡化後期綁定調用 494
16.4 使用動態數據簡化COM互操作 497
16.4.1 主互操作程式集的作用 498
16.4.2 嵌入互操作元數據 499
16.4.3 普通COM互操作的難點 500
16.5 使用C# 動態數據進行COM互操作 500
16.6 不使用C# 動態數據進行COM互操作 504
16.7 小結 505
第17章 進程、應用程式域和對象上下文 506
17.1 Windows進程的作用 506
17.2 .NET平台下與進程進行互動 508
17.2.1 列舉運行中的進程 510
17.2.2 特定的進程 511
17.2.3 進程的執行緒集合 511
17.2.4 進程中的模組集合 513
17.2.5 以編程方式啟動或結束進程 514
17.2.6 使用ProcessStartInfo類控制進程的啟動 515
17.3 .NET應用程式域 516
17.4 與默認應用程式域進行互動 518
17.4.1 枚舉載入的程式集 519
17.4.2 接收程式集載入通知 520
17.5 創建新的應用程式域 521
17.5.1 在自定義應用程式域中載入程式集 522
17.5.2 以編程方式卸載應用程式域 523
17.6 對象上下文邊界 525
17.6.1 上下文靈活和上下文綁定類型 525
17.6.2 定義上下文綁定對象 526
17.6.3 研究對象的上下文 526
17.7 進程、應用程式域和上下文小結 528
17.8 小結 528
第18章 CIL和動態程式集的作用 529
18.1 學習CIL語法的原因 529
18.2 CIL指令、特性和操作碼 530
18.2.1 CIL指令的作用 530
18.2.2 CIL特性的作用 530
18.2.3 CIL操作碼的作用 531
18.2.4 區別CIL操作碼和CIL助記符 531
18.3 入棧和出棧:CIL基於棧的本質 532
18.4 正反向工程 533
18.4.1 CIL代碼標籤的作用 536
18.4.2 與CIL互動:修改*.il檔案 536
18.4.3 使用ilasm.exe編譯CIL代碼 537
18.4.4 peverify.exe的作用 538
18.5 CIL指令和特性 539
18.5.1 在CIL中指定外部引用程式集 539
18.5.2 在CIL中定義當前程式集 539
18.5.3 在CIL中定義命名空間 540
18.5.4 在CIL中定義類類型 540
18.5.5 在CIL中定義和實現接口 541
18.5.6 在CIL中定義結構 542
18.5.7 在CIL中定義枚舉 542
18.5.8 在CIL中定義泛型 543
18.5.9 編譯CILTypes.il檔案 543
18.6 .NET基礎類庫、C#和CIL數據類型的映射 544
18.7 在CIL中定義類型成員 544
18.7.1 在CIL中定義數據欄位 545
18.7.2 在CIL中定義類型的構造函式 545
18.7.3 在CIL中定義屬性 546
18.7.4 定義成員參數 546
18.8 剖析CIL操作碼 547
18.8.1 .maxstack指令 548
18.8.2 在CIL中聲明本地變數 549
18.8.3 在CIL中映射參數到本地變數 550
18.8.4 this隱式引用 550
18.8.5 在CIL中使用循環結構 551
18.9 使用CIL構建.NET程式集 551
18.9.1 構建CILCars.dll 551
18.9.2 構建CILCarClient.exe 554
18.10 動態程式集 555
18.10.1 System.Reflection.Emit命名空間 556
18.10.2 System.Reflection.Emit.ILGenerator的作用 557
18.10.3 產生動態的程式集 557
18.10.4 產生程式集和模組集 559
18.10.5 ModuleBuilder類型的作用 560
18.10.6 產生HelloClass類型和字元串成員變數 561
18.10.7 產生構造函式 561
18.10.8 產生SayHello()方法 562
18.10.9 使用動態產生的程式集 563
18.11 小結 564
第六部分 .NET基礎類庫
第19章 多執行緒、並行和異步編程 566
19.1 進程、應用程式域、上下文及執行緒之間的關係 566
19.1.1 並發問題 567
19.1.2 執行緒同步的作用 568
19.2 .NET委託的簡短回顧 568
19.3 委託的異步性 570
19.3.1 BeginInvoke()和EndInvoke()方法 570
19.3.2 System.IAsyncResult接口 570
19.4 異步調用方法 571
19.4.1 同步調用執行緒 572
19.4.2 AsyncCallback委託的作用 573
19.4.3 AsyncResult類的作用 575
19.4.4 傳遞和接收自定義狀態數據 575
19.5 System.Threading命名空間 576
19.6 System.Threading.Thread類 577
19.6.1 獲得當前執行執行緒的統計信息 578
19.6.2 Name屬性 579
19.6.3 Priority屬性 579
19.7 手工創建次執行緒 580
19.7.1 使用ThreadStart委託 580
19.7.2 使用ParameterizedThreadStart委託 582
19.7.3 AutoResetEvent類 583
19.7.4 前台執行緒和後台執行緒 584
19.8 並發問題 585
19.8.1 使用C#的lock關鍵字進行同步 588
19.8.2 使用System.Threading.Monitor類型進行同步 589
19.8.3 使用System.Threading.Interlocked類型進行同步 590
19.8.4 使用[Synchronization]特性進行同步 591
19.9 使用TimerCallback編程 592
19.10 CLR執行緒池 593
19.11 使用任務並行庫進行並行編程 595
19.11.1 任務並行庫API 595
19.11.2 Parallel類的作用 596
19.11.3 使用Parallel類的數據並行 596
19.11.4 在次執行緒中訪問UI元素 598
19.11.5 Task類 599
19.11.6 處理取消請求 599
19.11.7 使用並行類的任務並行 601
19.12 並行LINQ查詢(PLINQ) 603
19.12.1 使用PLINQ查詢 604
19.12.2 取消PLINQ查詢 604
19.13 .NET 4.5下的異步調用 605
19.13.1 C# async和await關鍵字初探 606
19.13.2 異步方法的命名約定 607
19.13.3 返回void的異步方法 609
19.13.4 具有多個await的異步方法 609
19.13.5 用async/await改進AddWithThreads示例 610
19.14 小結 611
第20章 檔案輸入輸出和對象序列化 612
20.1 研究System.IO命名空間 612
20.2 Directory(Info)和File(Info)類型 613
20.3 使用DirectoryInfo類型 614
20.3.1 使用DirectoryInfo類型枚舉出檔案 616
20.3.2 使用DirectoryInfo類型創建子目錄 616
20.4 使用Directory類型 617
20.5 使用DriveInfo類類型 618
20.6 使用FileInfo類 619
20.6.1 FileInfo.Create()方法 620
20.6.2 FileInfo.Open()方法 621
20.6.3 FileInfo.OpenRead()和FileInfo.OpenWrite()方法 622
20.6.4 FileInfo.OpenText()方法 622
20.6.5 FileInfo.CreateText()和FileInfo.AppendText()方法 623
20.7 使用File類型 623
20.8 Stream抽象類 625
20.9 使用StreamWriter和StreamReader類型 627
20.9.1 寫文本檔案 628
20.9.2 讀文本檔案 628
20.9.3 直接創建StreamWriter/StreamReader類型 629
20.10 使用StringWriter和StringReader類型 630
20.11 使用BinaryWriter和BinaryReader 631
20.12 以編程方式“觀察”檔案 632
20.13 對象序列化 634
20.14 為序列化配置對象 637
20.14.1 定義可序列化的類型 637
20.14.2 公共欄位、私有欄位和公共屬性 638
20.15 選擇序列化格式化程式 638
20.15.1 IFormatter和IRemoting-Formatting接口 639
20.15.2 在格式化程式中的類型保真 640
20.16 使用BinaryFormatter序列化對象 641
20.17 使用SoapFormatter序列化對象 642
20.18 使用XmlSerializer序列化對象 643
20.19 序列化對象集合 645
20.20 自定義Soap/Binary序列化過程 647
20.20.1 深入了解對象序列化 647
20.20.2 使用ISerializable自定義序列化 648
20.20.3 使用特性定製序列化 650
20.21 小結 651
第21章 ADO.NET之一:連線層 653
21.1 ADO.NET的巨觀定義 653
21.2 ADO.NET數據提供程式 655
21.2.1 微軟提供的ADO.NET數據提供程式 656
21.2.2 關於System.Data.Oracle-Client.dll 657
21.2.3 選擇第三方的數據提供程式 657
21.3 其他的ADO.NET命名空間 658
21.4 System.Data命名空間的類型 658
21.4.1 IDbConnection接口的作用 659
21.4.2 IDbTransaction接口的作用 659
21.4.3 IDbCommand接口的作用 660
21.4.4 IDbDataParameter和IDataParameter接口的作用 660
21.4.5 IDbDataAdapter和IDataAdapter接口的作用 661
21.4.6 IDataReader和IDataRecord接口的作用 661
21.5 使用接口的抽象數據提供程式 662
21.6 創建AutoLot資料庫 665
21.6.1 創建Inventory表 665
21.6.2 為Inventory表添加測試記錄 667
21.6.3 編寫GetPetName()存儲過程 668
21.6.4 創建Customers和Orders表 669
21.6.5 可視化創建表關係 671
21.7 ADO.NET數據提供程式工廠模型 672
21.7.1 完整的數據提供程式工廠的例子 673
21.7.2 數據提供程式工廠模型的潛在缺陷 675
21.7.3 <connectionStrings>元素 676
21.8 ADO.NET的連線層 677
21.8.1 使用連線對象 678
21.8.2 使用ConnectionStringBuilder對象 679
21.8.3 使用命令對象 680
21.9 使用數據讀取器 681
21.10 構建可重用的數據訪問庫 683
21.10.1 增加連線邏輯 684
21.10.2 增加插入邏輯 685
21.10.3 增加刪除邏輯 686
21.10.4 增加更新邏輯 686
21.10.5 增加選擇邏輯 687
21.10.6 使用參數化的命令對象 688
21.10.7 執行存儲過程 690
21.11 創建控制台UI前端 691
21.11.1 實現Main()方法 691
21.11.2 實現ShowInstructions()方法 693
21.11.3 實現ListInventory()方法 693
21.11.4 實現DeleteCar()方法 694
21.11.5 實現InsertNewCar()方法 694
21.11.6 實現UpdateCarPetName()方法 695
21.11.7 實現LookUpPetName() 696
21.12 資料庫事務 697
21.12.1 ADO.NET事務對象的主要成員 697
21.12.2 為AutoLot資料庫添加CreditRisks表 698
21.12.3 為InventoryDAL添加事物方法 699
21.12.4 測試資料庫事務 700
21.13 小結 701
第22章 ADO.NET之二:下線層 702
22.1 ADO.NET下線層 702
22.2 DataSet的作用 703
22.2.1 DataSet的主要屬性 704
22.2.2 DataSet的主要方法 704
22.2.3 構建DataSet 705
22.3 使用DataColumn 705
22.3.1 構建DataColumn 706
22.3.2 啟用自增列 707
22.3.3 把DataColumn對象加入DataTable 707
22.4 使用DataRow 707
22.4.1 RowState屬性 709
22.4.2 DataRowVersion屬性 710
22.5 使用DataTable 710
22.5.1 將DataTable插入到DataSet中 711
22.5.2 獲取DataSet中的數據 712
22.5.3 使用DataTableReader對象處理DataTable 713
22.5.4 序列化DataTable/DataSet對象為XML 714
22.5.5 以二進制格式序列化Data-Table/DataSet對象 715
22.6 將DataTable對象綁定到用戶界面 716
22.6.1 從泛型List<T>合成DataTable 717
22.6.2 從DataTable中刪除行 719
22.6.3 根據篩選條件選擇行 720
22.6.4 在DataTable中更新行 722
22.6.5 使用DataView類型 723
22.7 使用數據適配器 724
22.7.1 一個簡單的數據適配器示例 725
22.7.2 映射資料庫名稱為友好名稱 726
22.8 向AutoLotDAL.dll添加下線功能 727
22.8.1 定義初始類類型 727
22.8.2 使用SqlCommandBuilder來配置數據適配器 728
22.8.3 實現GetAllInventory() 729
22.8.4 實現UpdateInventory() 729
22.8.5 設定版本號 729
22.8.6 測試非連線的功能 730
22.9 多表DataSet對象和數據關係 731
22.9.1 建立數據適配器 732
22.9.2 建立表間關係 733
22.9.3 更新Database表 733
22.9.4 在關聯表中切換 734
22.10 Windows Forms資料庫設計器工具 736
22.10.1 可視化設計DataGridView 736
22.10.2 生成的App.config檔案 740
22.10.3 強類型的DataSet 740
22.10.4 強類型的DataTable 741
22.10.5 強類型的DataRow 742
22.10.6 強類型的數據適配器 743
22.10.7 完成Windows Forms應用程式 744
22.11 將強類型的資料庫代碼隔離到類庫中 744
22.11.1 查看生成的代碼 746
22.11.2 用生成的代碼選擇數據 747
22.11.3 用生成的代碼插入數據 748
22.11.4 用生成的代碼刪除數據 748
22.11.5 用生成的代碼調用存儲過程 749
22.12 LINQ to DataSet 750
22.12.1 DataSet Extensions庫的作用 751
22.12.2 獲取與LINQ兼容的DataTable 752
22.12.3 DataRowExtensions.Field-<T>()擴展方法的作用 753
22.12.4 從LINQ查詢中生成新的DataTable 754
22.13 小結 754
第23章 ADO.NET之三:Entity Framework 756
23.1 Entity Framework的作用 756
23.1.1 實體的作用 758
23.1.2 Entity Framework的基礎知識 760
23.2 創建和分析EDM 764
23.3 對概念模型進行編程 774
23.4 AutoLotDAL 4.0版,加入實體 779
23.4.1 導航屬性的作用 780
23.4.2 在LINQ to Entity查詢中使用導航屬性 781
23.4.3 調用存儲過程 782
23.5 將數據實體綁定到Windows Forms GUI 783
23.6 展望.NET數據訪問API的未來 786
23.7 小結 787
第24章 LINQ to XML簡介 788
24.1 兩個XML API的故事 788
24.1.1 更優秀的DOM——LINQ to XML 789
24.1.2 更優秀的LINQ to XML——VB字面量語法 790
24.2 System.Xml.Linq命名空間的成員 791
24.2.1 LINQ to XML的軸方法 793
24.2.2 奇妙的XName和XNamespace 794
24.3 使用XElement和XDocument 795
24.3.1 從數組和容器中生成文檔 797
24.3.2 載入和解析XML內容 798
24.4 在記憶體中操作XML文檔 798
24.4.1 構建LINQ to XML應用程式的UI 799
24.4.2 引入Inventory.xml檔案 799
24.4.3 定義LINQ to XML輔助類 800
24.4.4 將UI組裝到輔助類 801
24.5 小結 802
第25章 WCF 803
25.1 各種分散式計算API 803
25.1.1 DCOM的作用 804
25.1.2 COM+/企業服務的作用 804
25.1.3 MSMQ的作用 805
25.1.4 .NET Remoting的作用 805
25.1.5 XML Web服務的作用 806
25.2 WCF的作用 807
25.2.1 WCF特性概覽 807
25.2.2 SOA概覽 808
25.2.3 WCF概要 809
25.3 WCF核心程式集 809
25.4 Visual Studio WCF項目模板 810
25.5 WCF應用程式的基本構成 811
25.6 WCF的ABC 812
25.6.1 WCF契約 813
25.6.2 WCF綁定 814
25.6.3 WCF地址 816
25.7 構建WCF服務 816
25.7.1 [ServiceContract]特性 818
25.7.2 [OperationContract]特性 819
25.7.3 作為操作契約的服務類型 819
25.8 承載WCF服務 820
25.8.1 在App.config檔案中創建
ABC 820
25.8.2 針對ServiceHost類型進行編程 821
25.8.3 指定庫地址 821
25.8.4 ServiceHost類型的功能 823
25.8.5 <system.serviceModel>元素的細節 824
25.8.6 啟用元數據交換 825
25.9 構建WCF客戶端應用程式 827
25.9.1 使用svcutil.exe生成代理代碼 827
25.9.2 使用Visual Studio生成代理代碼 828
25.9.3 配置基於TCP的綁定 830
25.10 簡化配置設定 831
25.10.1 使用默認終結點 831
25.10.2 使用多重綁定公開單獨的WCF服務 832
25.10.3 修改WCF綁定的設定 833
25.10.4 使用默認的MEX行為配置 835
25.10.5 刷新客戶端代理和選擇綁定 836
25.11 使用WCF服務庫項目模板 837
25.11.1 構建簡單的Math服務 837
25.11.2 使用WcfTestClient.exe測試WCF服務 838
25.11.3 使用SvcConfigEditor.exe修改配置檔案 839
25.12 以Windows服務承載WCF服務 840
25.12.1 在代碼中指定ABC 841
25.12.2 啟用MEX 843
25.12.3 創建Windows服務安裝程式 843
25.12.4 安裝Windows服務 845
25.13 從客戶端異步調用服務 845
25.14 定義WCF數據契約 847
25.14.1 使用Web相關的WCF服務項目模板 848
25.14.2 實現服務契約 849
25.14.3 *.svc檔案的作用 851
25.14.4 更新web.config檔案 851
25.14.5 測試服務 851
25.15 小結 852
第26章 Windows Workflow Foundation簡介 853
26.1 定義業務流程 853
26.2 構建簡單的工作流 854
26.3 Workflow運行時 857
26.3.1 使用WorkflowInvoker承載工作流 857
26.3.2 使用WorkflowApplication承載工作流 860
26.3.3 第一個工作流示例回顧 861
26.4 檢查Workflow中的活動 861
26.4.1 控制流活動 861
26.4.2 流程圖活動 862
26.4.3 訊息傳遞活動 862
26.4.4 狀態機活動 863
26.4.5 運行時活動與基元活動 863
26.4.6 事務活動 863
26.4.7 集合活動和錯誤處理活動 864
26.5 構建流程圖工作流 864
26.5.1 在流程圖中連線活動 865
26.5.2 使用InvokeMethod活動 866
26.5.3 定義工作流變數 867
26.5.4 使用FlowDecision活動 868
26.5.5 使用TerminateWorkflow活動 868
26.5.6 構建“true”條件 869
26.5.7 使用ForEach<T>活動 870
26.5.8 完成應用程式 872
26.5.9 我們做了什麼 873
26.6 在專門的DLL中構建Squence工作流 874
26.6.1 定義初始化項目 874
26.6.2 引入程式集和命名空間 876
26.6.3 定義工作流參數 877
26.6.4 定義工作流變數 877
26.6.5 使用Assign活動 878
26.6.6 使用If和Switch活動 879
26.6.7 構建自定義代碼活動 882
26.7 使用工作流庫 884
26.8 小結 886
第七部分 WPF
第27章 WPF和XAML 888
27.1 WPF背後的動機 888
27.1.1 統一多種不同的API 889
27.1.2 通過XAML將關注點分離 889
27.1.3 提供最佳化的呈現模型 890
27.1.4 簡化複雜的UI編程 890
27.2 各種形式的WPF應用程式 891
27.2.1 傳統的桌面應用程式 891
27.2.2 基於導航的WPF應用程式 892
27.2.3 XBAP應用程式 893
27.2.4 WPF/Silverlight關係 894
27.3 WPF程式集 894
27.3.1 Application類的作用 896
27.3.2 Window類的作用 897
27.4 創建不使用XAML的WPF應用程式 900
27.4.1 創建強類型的Window類 902
27.4.2 創建簡單的用戶界面 902
27.4.3 與應用程式級別的數據互動 904
27.4.4 處理Window對象的關閉 905
27.4.5 攔截滑鼠事件 906
27.4.6 攔截鍵盤事件 907
27.5 僅使用XAML構建WPF應用程式 908
27.5.1 用XAML定義窗體對象 909
27.5.2 用XAML定義套用對象 910
27.5.3 通過msbuild.exe處理XAML檔案 911
27.6 將標記轉換為.NET程式集 913
27.6.1 將視窗XAML標記映射到C#代碼 913
27.6.2 BAML的作用 914
27.6.3 將應用程式XAML標記映射到C#代碼 915
27.6.4 XAML到程式集的過程摘要 916
27.7 WPF XAML語法 916
27.7.1 Kaxaml 917
27.7.2 XAML XML命名空間和XAML關鍵字 918
27.7.3 控制類和成員變數的可見性 920
27.7.4 XAML元素、XAML特性和類型轉換器 920
27.7.5 XAML屬性元素語法 921
27.7.6 XAML附加屬性 922
27.7.7 XAML標記擴展 923
27.8 使用代碼隱藏檔案構建WPF應用程式 924
27.8.1 為MainWindow類添加代碼檔案 925
27.8.2 為MyApp類添加代碼檔案 925
27.8.3 用msbuild.exe處理代碼檔案 926
27.9 使用Visual Studio構建WPF應用程式 927
27.9.1 WPF項目模板 927
27.9.2 工具箱和XAML設計器/編輯器 928
27.9.3 使用Properties視窗設定屬性 929
27.9.4 使用Properties視窗處理事件 930
27.9.5 在XAML編輯器中處理事件 931
27.9.6 Document Outline視窗 932
27.9.7 查看自動生成的代碼檔案 933
27.10 使用Visual Studio構建自定義XAML編輯器 933
27.10.1 設計視窗的GUI 934
27.10.2 實現Loaded事件 935
27.10.3 實現按鈕的Click事件 936
27.10.4 實現Closed事件 937
27.10.5 測試應用程式 937
27.10.6 探索WPF 文檔 938
27.11 小結 939
第28章 使用WPF控制項編程 941
28.1 WPF核心控制項概述 941
28.1.1 WPF Ink控制項 942
28.1.2 WPF Document控制項 942
28.1.3 WPF公共對話框 942
28.1.4 文檔中的細節 943
28.2 Visual Studio WPF設計器 944
28.2.1 在Visual Studio中使用WPF控制項 944
28.2.2 使用Document Outline編輯器 945
28.3 使用面板控制內容布局 946
28.3.1 在Canvas面板中放置內容 948
28.3.2 在WrapPanel面板中放置內容 949
28.3.3 在StackPanel面板中放置內容 951
28.3.4 在Grid面板中放置內容 952
28.3.5 在DockPanel面板中放置內容 954
28.3.6 啟用Panel類型的滾動功能 955
28.3.7 使用Visual Studio設計器配置Panel 956
28.4 使用嵌套面板構建視窗框架 959
28.4.1 構建選單系統 960
28.4.2 構建工具條 962
28.4.3 構建狀態條 963
28.4.4 完成UI設計 963
28.4.5 實現MouseEnter/MouseLeave事件處理程式 964
28.4.6 實現拼寫檢查邏輯 964
28.5 WPF命令 965
28.5.1 內置的命令對象 965
28.5.2 將命令連線到Command屬性 966
28.5.3 將命令連線到任意行為 967
28.5.4 使用Open和Save命令 968
28.6 深入了解WPF API和控制項 970
28.7 構建Ink API選項卡 972
28.7.1 設計工具條 973
28.7.2 RadioButton控制項 975
28.7.3 處理Ink API選項卡的事件 977
28.7.4 InkCanvas控制項 977
28.7.5 ComboBox控制項 980
28.7.6 保存、載入和清除InkCanvas數據 981
28.8 Documents API 982
28.8.1 塊元素和內聯元素 982
28.8.2 文檔布局管理器 982
28.9 構建Documents選項卡 983
28.9.1 使用代碼填充FlowDocument 984
28.9.2 啟用批註和便簽 985
28.9.3 保存和載入流文檔 986
28.10 WPF數據綁定模型 987
28.10.1 構建Data Binding選項卡 988
28.10.2 使用Visual Studio建立數據綁定 988
28.10.3 DataContext屬性 990
28.10.4 使用IValueConverter進行數據轉換 991
28.10.5 在代碼中建立數據綁定 992
28.10.6 構建DataGrid選項卡 992
28.11 小結 994
第29章 WPF圖形呈現服務 995
29.1 理解WPF的圖形呈現服務 995
29.2 使用形狀呈現圖形數據 996
29.2.1 在畫布中添加矩形、橢圓形和線條 998
29.2.2 在畫布中移除矩形、圓形和線條 1001
29.2.3 折線和多邊形 1002
29.2.4 路徑 1002
29.3 WPF畫刷和畫筆 1005
29.3.1 使用Visual Studio配置畫刷 1006
29.3.2 在代碼中配置畫刷 1008
29.3.3 配置畫筆 1009
29.4 圖形變換 1009
29.4.1 變換概覽 1010
29.4.2 變換Canvas數據 1011
29.5 使用Visual Studio變換編輯器 1012
29.5.1 構建初始布局 1012
29.5.2 在設計時套用變換 1014
29.5.3 在代碼中變換畫布 1015
29.6 使用繪圖和幾何圖形呈現圖形數據 1015
29.6.1 使用幾何圖形構建DrawingBrush 1017
29.6.2 用DrawingBrush進行繪畫 1017
29.6.3 在DrawingImage中使用繪圖類型 1018
29.7 Expression Design的作用 1019
29.7.1 將示例設計檔案導出為XAML 1019
29.7.2 將圖像數據導入WPF對象 1021
29.7.3 與熊共舞 1022
29.8 使用可視化層呈現圖形數據 1022
29.9 小結 1028
第30章 WPF資源、動畫和樣式 1029
30.1 理解WPF資源系統 1029
30.2 使用對象(邏輯)資源 1034
30.2.1 Resources屬性的作用 1034
30.2.2 定義視窗級別的資源 1035
30.2.3 {StaticResource}標記擴展 1037
30.2.4 {DynamicResource}標記擴展 1037
30.2.5 應用程式級別的資源 1038
30.2.6 定義合併的資源字典 1039
30.2.7 定義只含資源的程式集 1041
30.3 理解WPF動畫服務 1042
30.3.1 動畫類型的作用 1043
30.3.2 To、From和By屬性 1043
30.3.3 Timeline基類的作用 1044
30.3.4 用C#代碼創建動畫 1044
30.3.5 控制動畫的速度 1045
30.3.6 動畫的反轉和循環 1046
30.4 用XAML創建動畫 1047
30.4.1 演示圖板的作用 1047
30.4.2 事件觸發器的作用 1048
30.4.3 使用不連續的關鍵幀創建動畫 1048
30.5 WPF樣式的作用 1049
30.5.1 定義並使用樣式 1050
30.5.2 重寫樣式設定 1050
30.5.3 使用TargetType自動套用樣式 1051
30.5.4 繼承已有的樣式 1052
30.5.5 未命名樣式的作用 1052
30.5.6 使用觸發器定義樣式 1053
30.5.7 使用多個觸發器定義樣式 1053
30.5.8 動畫樣式 1054
30.5.9 以編程方式設定樣式 1054
30.6 小結 1056
第31章 依賴屬性、路由事件和模板 1057
31.1 依賴屬性的作用 1057
31.1.1 已知的依賴屬性 1059
31.1.2 CLR屬性包裝器的重要說明 1061
31.2 構建自定義依賴屬性 1061
31.2.1 添加數據驗證例程 1065
31.2.2 回響屬性的改變 1065
31.3 路由事件 1066
31.3.1 路由冒泡事件的作用 1067
31.3.2 繼續或中止冒泡 1068
31.3.3 路由隧道事件的作用 1068
31.4 邏輯樹、可視樹和默認模板 1070
31.4.1 以編程方式查看邏輯樹 1070
31.4.2 以編程方式查看可視樹 1072
31.4.3 以編程方式查看控制項的默認模板 1073
31.5 使用觸發器框架構建自定義控制項模板 1075
31.5.1 模板資源 1076
31.5.2 使用觸發器添加可視提示 1078
31.5.3 {TemplateBinding}標記擴展的作用 1079
31.5.4 ContentPresenter的作用 1080
31.5.5 融合模板和樣式 1081
31.6 小結 1082
第八部分 ASP.NET Web Form
第32章 ASP.NET Web Form 1084
32.1 HTTP的作用 1084
32.1.1 HTTP請求/回響循環 1084
32.1.2 HTTP是無狀態協定 1085
32.2 Web應用程式和Web伺服器 1085
32.2.1 IIS虛擬目錄的作用 1085
32.2.2 ASP.NET Development Web Server 1086
32.3 HTML的作用 1087
32.3.1 HTML文檔結構 1087
32.3.2 HTML表單的作用 1088
32.3.3 Visual Studio HTML設計器工具 1088
32.3.4 構建HTML表單 1090
32.4 客戶端腳本的作用 1091
32.5 回發到Web伺服器 1093
32.6 ASP.NET API概覽 1094
32.6.1 ASP.NET 2.0及其後續版本的主要特性 1095
32.6.2 ASP.NET 3.5(和.NET 3.5 SP1)的主要特性 1096
32.6.3 ASP.NET 4.0和4.5的主要特性 1096
32.7 構建單個檔案的ASP.NET網頁 1097
32.7.1 引用AutoLotDAL.dll 1098
32.7.2 設計UI 1098
32.7.3 添加數據訪問邏輯 1099
32.7.4 ASP.NET指令的作用 1101
32.7.5 腳本塊 1102
32.7.6 ASP.NET控制項聲明 1103
32.8 使用代碼檔案構建ASP.NET Web頁面 1104
32.8.1 引用AutoLotDAL.dll程式集 1106
32.8.2 更新代碼檔案 1107
32.8.3 調試並跟蹤ASP.NET頁面 1107
32.9 ASP.NET Web Site和ASP.NET Web Application 1108
32.10 ASP.NET網站目錄結構 1110
32.10.1 引用程式集 1110
32.10.2 App_Code資料夾的作用 1111
32.11 頁面類型的繼承鏈 1111
32.12 與傳入的HTTP請求互動 1113
32.12.1 獲得瀏覽器統計數據 1113
32.12.2 訪問傳入的表單數據 1114
32.12.3 IsPostBack屬性 1115
32.13 與輸出HTTP回響互動 1115
32.13.1 提交HTML內容 1116
32.13.2 重定向用戶 1116
32.14 ASP.NET網頁的生命周期 1117
32.14.1 AutoEventWireUp特性的作用 1118
32.14.2 Error事件 1118
32.15 web.config檔案的作用 1120
32.16 小結 1121
第33章 ASP.NET Web控制項、母版頁和主題 1122
33.1 Web控制項的本質 1122
33.1.1 伺服器端事件處理 1123
33.1.2 AutoPostBack屬性 1123
33.2 Control和WebControl基類 1124
33.2.1 枚舉所包含的控制項 1125
33.2.2 動態添加和刪除控制項 1127
33.2.3 與動態創建的控制項互動 1128
33.2.4 WebControl基類的功能 1128
33.3 ASP.NET Web控制項的類別 1129
33.3.1 關於System.Web.UI.HtmlControls的簡短說明 1131
33.3.2 Web控制項的文檔 1132
33.4 構建ASP.NET汽車網站 1132
33.4.1 使用ASP.NET母版頁工作 1133
33.4.2 定義默認的內容頁面 1138
33.4.3 設計Inventory內容頁面 1140
33.4.4 設計Build-a-Car內容頁面 1143
33.5 驗證控制項的作用 1146
33.5.1 開啟客戶端JavaScript驗證支持 1147
33.5.2 RequiredFieldValidator 1148
33.5.3 RegularExpressionValidator 1148
33.5.4 RangeValidator 1148
33.5.5 CompareValidator 1149
33.5.6 創建ValidationSummary 1150
33.5.7 定義驗證分組 1151
33.6 使用主題 1152
33.6.1 *.skin檔案 1153
33.6.2 套用網站級別的主題 1155
33.6.3 在頁面級別套用主題 1155
33.6.4 SkinID屬性 1155
33.6.5 以編程方式分配主題 1156
33.7 小結 1157
第34章 ASP.NET狀態管理技術 1158
34.1 狀態問題 1158
34.2 ASP.NET狀態管理技術 1160
34.3 ASP.NET視圖狀態的作用 1160
34.3.1 演示視圖狀態 1161
34.3.2 添加自定義視圖狀態數據 1162
34.4 Global.asax檔案的作用 1163
34.4.1 全局最後異常事件處理程式 1164
34.4.2 HttpApplication基類 1165
34.5 應用程式狀態與會話狀態的差別 1165
34.5.1 維護應用程式級的狀態數據 1166
34.5.2 修改應用程式數據 1168
34.5.3 處理Web應用程式的關閉 1169
34.6 使用應用程式快取 1169
34.6.1 使用數據快取 1170
34.6.2 修改*.aspx檔案 1172
34.7 維護會話數據 1174
34.8 cookie 1177
34.8.1 創建cookie 1177
34.8.2 讀取傳入的cookie數據 1178
34.9 <sessionState>元素的作用 1179
34.9.1 在ASP.NET會話狀態伺服器中保存會話數據 1179
34.9.2 把會話數據保存在專門的資料庫中 1180
34.10 ASP.NET用戶配置API 1181
34.10.1 ASPNETDB.mdf資料庫 1181
34.10.2 在web.config中定義用戶配置 1182
34.10.3 以編程方式訪問用戶配置數據 1183
34.10.4 分組用戶配置數據並且持久化自定義對象 1185
34.11 小結 1186
索引 1187