精通C#(第6版)

CTS121.5.1 CTS類類型121.5.2 CTS接口類型121.5.3

內容介紹

本書是C# 領域久負盛名的經典著作,深入全面地講解了C# 程式語言和.NET 平台的核心內容,並結合大量示例剖析相關概念。全書分為八部分:C# 和.NET 平台、C# 核心編程結構、C# 面向對象編程、高級C# 編程結構、用.NET 程式集編程、.NET 基礎類庫、WPF 和ASP.NET Web Forms。第6 版是對第5 版的進一步更新和完善,內容涵蓋了最先進的.NET 編程技術和技巧,並準確呈現出C# 程式語言的最新變化和.NET 4.5 Framework 的新特性。
本書由微軟C# MVP Andrew Troelsen 編寫,第6 版專門針對C# 5.0 和.NET 4.5 進行了細緻入微的修訂,是各層次.NET 開發人員的必讀之作。

作者介紹

Andrew Troelsen
世界級C#專家,微軟Visual C# MVP。他是著名的微軟技術諮詢企業Intertech的合伙人和副總裁,該公司的客戶包括微軟、霍尼韋爾、美國國家航空航天局等。他曾是MSDN網站和MacTech網站.NET技術帖專家,並經常在業界主要技術會議上發表演講和開設技術講座。他還是公認的C#和.NET暢銷技術書作家。除本書外,他還著有Pro Expression Blend 4、Pro VB 2008 and the .NET 3.5 Platform和COM and .NET Interoperability等近二十部.NET技術方面的著作。

作品目錄

目 錄
第一部分 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  CTS12
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  CLS15
1.7  CLR16
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 Framework40
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 Designer47
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.TimeSpan70
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.Object193
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 Object353
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  再一次,不使用LINQ359
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  CIL421
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  研究TypeRef452
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.dll480
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.dll551
18.9.2  構建CILCarClient.exe554
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  任務並行庫API595
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和BinaryReader631
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.dll657
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  構建DataSet705
22.3  使用DataColumn705
22.3.1  構建DataColumn706
22.3.2  啟用自增列707
22.3.3  把DataColumn對象加入DataTable707
22.4  使用DataRow707
22.4.1  RowState屬性709
22.4.2  DataRowVersion屬性710
22.5  使用DataTable710
22.5.1  將DataTable插入到DataSet中711
22.5.2  獲取DataSet中的數據712
22.5.3  使用DataTableReader對象處理DataTable713
22.5.4  序列化DataTable/DataSet對象為XML714
22.5.5  以二進制格式序列化Data-Table/DataSet對象715
22.6  將DataTable對象綁定到用戶界面716
22.6.1  從泛型List<T>合成DataTable717
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  可視化設計DataGridView736
22.10.2  生成的App.config檔案740
22.10.3  強類型的DataSet740
22.10.4  強類型的DataTable741
22.10.5  強類型的DataRow742
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 DataSet750
22.12.1  DataSet Extensions庫的作用751
22.12.2  獲取與LINQ兼容的DataTable752
22.12.3  DataRowExtensions.Field-<T>()擴展方法的作用753
22.12.4  從LINQ查詢中生成新的DataTable754
22.13  小結754
第23章 ADO.NET之三:Entity Framework756
23.1  Entity Framework的作用756
23.1.1  實體的作用758
23.1.2  Entity Framework的基礎知識760
23.2  創建和分析EDM764
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 GUI783
23.6  展望.NET數據訪問API的未來786
23.7  小結787
第24章 LINQ to XML簡介788
24.1  兩個XML API的故事788
24.1.1  更優秀的DOM——LINQ to XML789
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和XNamespace794
24.3  使用XElement和XDocument795
24.3.1  從數組和容器中生成文檔797
24.3.2  載入和解析XML內容798
24.4  在記憶體中操作XML文檔798
24.4.1  構建LINQ to XML應用程式的UI799
24.4.2  引入Inventory.xml檔案799
24.4.3  定義LINQ to XML輔助類800
24.4.4  將UI組裝到輔助類801
24.5  小結802
第25章 WCF803
25.1  各種分散式計算API803
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的ABC812
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檔案中創建
ABC820
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  在代碼中指定ABC841
25.12.2  啟用MEX843
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和XAML888
27.1  WPF背後的動機888
27.1.1  統一多種不同的API889
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  Kaxaml917
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  設計視窗的GUI934
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設計器配置Panel956
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 API982
28.8.1  塊元素和內聯元素982
28.8.2  文檔布局管理器982
28.9  構建Documents選項卡983
28.9.1  使用代碼填充FlowDocument984
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  使用幾何圖形構建DrawingBrush1017
29.6.2  用DrawingBrush進行繪畫1017
29.6.3  在DrawingImage中使用繪圖類型1018
29.7  Expression Design的作用1019
29.7.1  將示例設計檔案導出為XAML1019
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 Server1086
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.dll1098
32.7.2  設計UI1098
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 Application1108
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  RequiredFieldValidator1148
33.5.3  RegularExpressionValidator1148
33.5.4  RangeValidator1148
33.5.5  CompareValidator1149
33.5.6  創建ValidationSummary1150
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  cookie1177
34.8.1  創建cookie1177
34.8.2  讀取傳入的cookie數據1178
34.9  <sessionState>元素的作用1179
34.9.1  在ASP.NET會話狀態伺服器中保存會話數據1179
34.9.2  把會話數據保存在專門的資料庫中1180
34.10  ASP.NET用戶配置API1181
34.10.1  ASPNETDB.mdf資料庫1181
34.10.2  在web.config中定義用戶配置1182
34.10.3  以編程方式訪問用戶配置數據1183
34.10.4  分組用戶配置數據並且持久化自定義對象1185
34.11  小結1186
索引1187

相關詞條

熱門詞條

聯絡我們