目 錄
第一部分 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
· · · · · · (
收起)