图书介绍

精通C# 原书第6版PDF|Epub|txt|kindle电子书版本网盘下载

精通C# 原书第6版
  • (美)特罗尔森著;姚琪琳等译 著
  • 出版社: 北京:人民邮电出版社
  • ISBN:9787115321817
  • 出版时间:2013
  • 标注页数:1194页
  • 文件大小:451MB
  • 文件页数:1226页
  • 主题词:C语言-程序设计

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

精通C# 原书第6版PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第一部分 C#与.NET平台2

第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 使用NewProject对话框指向.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.5SDK文档系统50

2.7 小结51

第二部分 C#核心编程结构54

第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#面向对象编程126

第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#编程结构256

第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 使用Oueue<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程序集编程406

第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 查看(部分)EngineState450

枚举的元数据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基础类库566

第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之三:EntityFramework756

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 在LINQtoEntity查询中使用导航属性781

23.4.3 调用存储过程782

23.5 将数据实体绑定到Windows FormsGUI783

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 构建LINQtoXML应用程序的UI799

24.4.2 引入Inventory.xml文件799

24.4.3 定义LINQ toXML辅助类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 使用WefTestClient.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

第七部分 WPF888

第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 {Temp.1ateBinding}标记扩展的作用1079

31.5.4 ContentPresenter的作用1080

31.5.5 融合模板和样式1081

31.6 小结1082

第八部分 ASP.NET Web Form1084

第32章 ASP.NET Web Form1084

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.NETWeb控件、母版页和主题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 RegularExpression Validator1148

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

热门推荐