第Ⅰ部分 设计策略 3
第1章 定义语言环境 3
1.1 设计战略元素的定义 3
1.2 C#语言 4
1.2.1 C#语言的优点 5
1.2.2 了解劣势 8
1.2.3 使用多种语言开发 10
1.2.4 多平台 11
1.3 盘点工具 11
1.4 收集资源 12
1.4.1 团队语言资源库 12
1.4.2 团队技能 13
1.4.3 经验的意义 13
1.4.4 定义外部资源需求 14
1.5 制定自己的设计策略 14
第2章 应用程序生命周期 17
2.1 生命周期的阶段 18
2.1.1 确定应用程序概念 18
2.1.2 构建应用程序开发团队 19
2.1.3 定义规范 21
2.1.4 确定概念的可行性 22
2.1.5 创建设计 23
2.1.6 测试设计 26
2.1.7 实现设计 27
2.1.8 编写应用程序 28
2.1.9 调试和测试应用程序 29
2.1.10 测试用户需求 30
2.1.11 提高可靠性和安全性 31
2.1.12 部署应用程序 32
2.1.13 应用程序的支持与维护 33
2.1.14 应用程序退役 34
2.2 生命周期模型 35
2.2.1 螺旋模型 35
2.2.2 瀑布模型 37
2.2.3 抛弃式模型 39
2.2.4 演化模型 40
2.2.5 增量/迭代模型 41
2.2.6 快速应用开发模型 42
2.3 敏捷编程技术 44
2.3.1 了解敏捷编程 44
2.3.2 敏捷编程的优点 45
2.3.3 敏捷编程的缺点 46
2.3.4 常用敏捷编程策略 46
2.4 制定自己的设计策略 52
第3章 定义设计策略 53
3.1 创建对象模型 54
3.1.1 定义类概念 54
3.1.2 功能集 54
3.1.3 定义候选类 55
3.1.4 从候选类中选择类 56
3.1.5 开发内部类 58
3.1.6 添加外部类 58
3.1.7 考虑类的取舍问题 59
3.1.8 实现类设计 60
3.2 创建数据模型 61
3.2.1 定义数据需求 61
3.2.2 访问性、可靠性和安全性需求 63
3.2.3 创建数据类 64
3.3 用户需求 64
3.3.1 定义用户需求 65
3.3.2 创建用户类 67
3.4 将设计转化为UML 67
3.4.1 Visio 68
3.4.2 Visio UML功能概述 69
3.4.3 由UML生成代码 71
3.5 制定自己的设计策略 73
第4章 设计用户界面 75
4.1 应用程序窗体类型 75
4.1.1 创建对话框实用程序 76
4.1.2 单文档界面 78
4.1.3 多文档界面 79
4.1.4 选项卡式界面 80
4.1.5 开发皮肤界面和自由格式界面的应用程序 81
4.1.6 RibbonX应用程序 82
4.1.7 通知区域 84
4.1.8 命令行 85
4.2 常用用户界面类型 86
4.2.1 菜单驱动 87
4.2.2 任务驱动 87
4.2.3 信息驱动 88
4.2.4 向导驱动 88
4.2.5 角色驱动 89
4.3 制定用户界面策略 90
4.3.1 使用户保持控制权 91
4.3.2 使用户沿正确的方向操作 92
4.3.3 定义交互界面 92
4.3.4 定义可靠的界面 93
4.3.5 安全性 93
4.4 可访问性需求 94
4.4.1 视觉元素的考虑 95
4.4.2 添加工具提示和可访问性说明 96
4.4.3 色彩使用技巧 97
4.5 制定自己的设计策略 98
第5章 设计时的速度考虑 99
5.1 速度与性能 99
5.2 开发高速应用程序 101
5.2.1 多线程 101
5.2.2 速度并不等同于代码 102
5.2.3 多重处理的影响 102
5.3 测量应用程序的速度 103
5.3.1 标准计数器 103
5.3.2 定义应用程序计数器 109
5.4 制定自己的设计策略 112
第6章 设计时的可靠性考虑 115
6.1 检验资源的有效性 116
6.2 保存数据、设置和状态 118
6.2.1 实现数据存储 118
6.2.2 保存设置的方法 119
6.2.3 实现状态存储 121
6.3 预测意外情况 121
6.4 RibbonX的可靠性优势 122
6.5 制定自己的设计策略 123
第7章 设计中的安全性考虑 125
7.1 假设最坏情况 126
7.2 消除错误输入 127
7.2.1 使用正确的控件或组件 128
7.2.2 检验全部用户输入 129
7.2.3 验证数据源 135
7.3 隐藏数据 136
7.3.1 保持数据本地化 136
7.3.2 加密数据 137
7.3.3 将数据放在受保护的位置 138
7.4 添加应用程序监视 138
7.4.1 定义监视策略 139
7.4.2 实现日志记录 140
7.4.3 使用事件日志 141
7.4.4 发送管理员警报 142
7.5 团队概述 143
7.6 制定自己的设计策略 144
第Ⅱ部分 编码策略 147
第8章 定制集成开发环境 147
8.1 配置IDE 147
8.1.1 使用Visual Studio选项 148
8.1.2 定制工具栏和菜单 151
8.1.3 添加外部工具 155
8.2 使用代码段、宏和插件 156
8.2.1 创建和使用代码段 157
8.2.2 利用宏自动执行任务 159
8.2.3 依靠插件扩展功能 159
8.3 使用Visual Studio命令行 160
8.3.1 访问命令行 160
8.3.2 命令行开关 161
8.3.3 执行Visual Studio命令 164
8.3.4 运行应用程序 165
8.4 为自己的应用程序编写代码 165
第9章 脚本 167
9.1 脚本创建选择 167
9.1.1 使用SQL Server 168
9.1.2 创建C#脚本 168
9.1.3 C#表达式评估 169
9.1.4 Windows PowerShell 169
9.1.5 语言集成查询 170
9.2 与SQL Server交互 170
9.2.1 Visual Studio 171
9.2.2 使用SQL Server内置功能 172
9.3 在应用程序中加入脚本 174
9.4 C#表达式 174
9.5 制定Windows PowerShell解决方案 175
9.5.1 PS实用程序 176
9.5.2 创建脚本 177
9.5.3 执行脚本 180
9.5.4 获得调试支持 181
9.6 为自己的应用程序编写代码 181
第10章 在IDE中浏览数据 183
10.1 使用IDE元素 184
10.1.1 Autos’对话框 184
10.1.2 Locals对话框 185
10.1.3 Watch对话框 186
10.1.4 Command Window对话框 186
10.2 使用可视化器 187
10.2.1 为可视化器定义需求 187
10.2.2 Text可视化器 188
10.2.3 XML可视化器 189
10.2.4 HTML可视化器 190
10.2.5 DataSet可视化器 191
10.3 获取第三方可视化器 191
10.4 创建自定义可视化器 192
10.4.1 配置可视化器对象 192
10.4.2 添加可视化器代码 194
10.4.3 测试新可视化器 196
10.5 为自己的应用程序编写代码 198
第11章 控件与组件 199
11.1 控件与组件的区别 200
11.2 定义控件类型 204
11.2.1 创建派生控件 205
11.2.2 创建UserControl 212
11.2.3 创建新控件 214
11.3 创建组件 216
11.3.1 开发新组件时需要考虑的基本问题 216
11.3.2 定义新组件项目 217
11.4 添加新组件代码 218
11.5 测试组件 222
11.6 用对象测试平台测试类 224
11.7 为自己的应用程序编写代码 226
第12章 为应用程序编写代码 229
12.1 采用合适的命名习惯 229
12.1.1 匈牙利命名法 230
12.1.2 驼峰命名法 230
12.1.3 帕斯卡命名法 231
12.1.4 添加专用语法 232
12.2 添加命令行功能 234
12.2.1 何时使用命令行开关 234
12.2.2 添加命令行开关 235
12.2.3 测试命令行功能 240
12.3 正确退出应用程序 242
12.3.1 在什么情况下只关闭窗体是不够的 242
12.3.2 用System.Environment设置退出码 243
12.3.3 Application.Exit()方法 245
12.3.4 用P/Invoke退出应用程序 247
12.4 使用自定义功能 248
12.4.1 何时使用自定义功能 248
12.4.2 使用自定义特征和异常类 249
12.5 为自己的应用程序编写代码 249
第13章 文档 251
13.1 对应用程序增加文档支持 251
13.1.1 文档概述 252
13.1.2 考虑开发人员的需求 253
13.1.3 考虑用户需求 253
13.1.4 考虑管理员的需要 255
13.2 创建文档注释 256
13.2.1 注释的类型 256
13.2.2 注释的正确位置 259
13.3 使用XML文件 261
13.4 文档输出的其他作用 265
13.4.1 用LINQ查询文档文件 265
13.4.2 根据文档自动创建应用程序报告 266
13.5 为自己的应用程序编写代码 266
第14章 错误处理 267
14.1 对错误处理不做假设的优点 268
14.2 特殊错误处理的重要性 269
14.2.1 正确地使用标准异常类 269
14.2.2 实现自定义错误处理 278
14.2.3 错误层次的重要性 279
14.3 错误处理的一致性问题 280
14.3.1 单一来源错误 281
14.3.2 多来源错误 281
14.3.3 最终错误处理 281
14.4 设计自恢复应用程序 282
14.5 为自己的应用程序编写代码 284
第15章 测试、调试和质量保证 285
15.1 测试应用程序 285
15.1.1 创建新测试 286
15.1.2 运行测试 290
15.1.3 利用Test View对话框设置测试属性 291
15.1.4 利用测试列表编辑器组织测试 293
15.1.5 Code Coverage Results对话框 294
15.1.6 Test Runs对话框 296
15.1.7 人工测试 297
15.2 调试应用程序 298
15.2.1 调试对话框 298
15.2.2 向IDE提问题 299
15.2.3 浏览内存内容 300
15.2.4 通过用户获得漏洞 301
15.3 质量保证检验 301
15.3.1 与B团队交流 301
15.3.2 构造有价值的反馈 302
15.3.3 用户参与 303
15.4 为自己的应用程序编写代码 303
第16章 部署应用程序 305
16.1 确定部署类型 306
16.1.1 测试版 306
16.1.2 局部部署 307
16.1.3 企业部署 308
16.1.4 热塑-包装部署 309
16.1.5 主版本和次版本 309
16.2 选择部署方法 311
16.2.1 利用XCopy部署 312
16.2.2 创建基本的安装项目 313
16.2.3 修改细节 319
16.2.4 使用项目安装向导 320
16.2.5 CAB方法 321
16.3 选择介质类型 322
16.4 完成部署 323
16.5 评价结果 325
16.6 为自己的应用程序编写代码 326
第17章 应用程序的支持与维护 327
17.1 创建错误日志 327
17.1.1 定义错误 327
17.1.2 处理错误日志设置 328
17.1.3 创建错误日志类 329
17.1.4 浏览错误日志输出 332
17.2 利用错误日志提供支持 333
17.2.1 定义错误、资源和解决方案 333
17.2.2 确定是否需要开发人员直接交互 334
17.2.3 创建支持日志 334
17.3 通过错误日志和支持日志实现维护 334
17.3.1 维护优先级 335
17.3.2 检验维护要求 335
17.3.3 测试维护 335
17.3.4 部署补丁 336
17.4 为自己的应用程序编写代码 336
第Ⅲ部分 速度、可靠性及安全性第18章 围绕性能三角形开发 339
18.1 初始开发阶段后的工作 340
18.2 定义性能三角形 340
18.2.1 速度 342
18.2.2 可靠性 343
18.2.3 安全性 344
18.3 为应用程序创建完美的性能三角形 346
18.4 使应用程序既可靠又安全 347
第19章 应用程序的速度 349
19.1 定义速度的平衡性 349
19.1.1 在错误的位置删除代码 350
19.1.2 创建错误的答案确实快 351
19.2 速度测量 352
19.2.1 示例代码简介 353
19.2.2 启动性能向导 354
19.2.3 测评性能 357
19.2.4 浏览性能结果 363
19.2.5 性能报告比较 366
19.3 使应用程序既可靠又安全 368
第20章 应用程序的可靠性 369
20.1 定义可靠性的平衡 369
20.1.1 避免应用程序过度保守 370
20.1.2 创建绝对不做任何无效工作的应用程序 370
20.1.3 定义外部威胁 372
20.1.4 制定可靠性计划 372
20.2 意想不到的用户 373
20.2.1 最好是在测试期间中断应用程序 374
20.2.2 创建经验教训日志 374
20.3 检验代码 375
20.3.1 运行代码分析 376
20.3.2 计算代码度量 377
20.4 使应用程序既可靠又安全 379
第21章 应用程序的安全性 381
21.1 定义安全性的平衡 381
21.1.1 使数据远离用户 382
21.1.2 创建性能障碍 382
21.1.3 过度监管 383
21.2 入侵应用程序 384
21.2.1 依靠内部测试员测试 385
21.2.2 第三方测试 386
21.2.3 检验不可能性 387
21.2.4 交互作用 388
21.3 更新安全性配置文件 388
21.4 管理监视过程 389
21.5 数据的加密与解密 390
21.6 使应用程序既可靠又安全 391
第Ⅳ部分 编码技术 395
第22章 序列化XML 395
22.1 以XML作为存储方法 396
22.1.1 实现XCopy应用程序 396
22.1.2 XML数据示例 397
22.1.3 在报告中使用XML数据 399
22.2 创建XML存储类 400
22.2.1 定义XML数据元素 400
22.2.2 创建自定义数据说明 401
22.2.3 设计健壮的属性 402
22.3 以XML格式保存数据 403
22.3.1 选择数据位置 403
22.3.2 实现保存例程 404
22.4 以XML格式加载数据 405
22.4.1 从磁盘获得XML数据 406
22.4.2 使用XML数据修改环境 408
22.5 处理序列化的XML数据 409
22.5.1 添加新数据 409
22.5.2 编辑已有项 411
22.5.3 删除数据项 413
22.5.4 对数据项排序 415
22.5.5 在屏幕上显示数据项 417
22.6 实现自己的设计 417
第23章 LINQ 419
23.1 Visual Studio 2008对LINQ的支持 419
23.1.1 LINQ及提供程序 420
23.1.2 LINQ与SQL的比较 420
23.1.3 使用LINQ实现非查询解决方案 424
23.2 定义基本操作符 424
23.2.1 操作符from和select 424
23.2.2 操作符where 425
23.2.3 操作符orderby 426
23.3 创建LINQ查询 427
23.3.1 定义简单查询 427
23.3.2 多数据源的连接 428
23.3.3 操作符let 430
23.4 用LINQ与各种数据源交互 431
23.4.1 内置提供程序 431
23.4.2 LINQ to Objects提供程序 432
23.4.3 LINQ to DataSet提供程序 435
23.4.4 LINQto SQL提供程序 439
23.4.5 LINQ to XML提供程序 444
23.4.6 第三方提供程序 449
23.5 实现自己的设计 451
第24章 利用F#使应用程序增值 453
24.1 了解F# 454
24.1.1 函数式语言 454
24.1.2 定义函数式语言的需求 455
24.2 Visual Studio 2008对F#的支持 455
24.2.1 下载产品 456
24.2.2 安装F# 456
24.3 使用命令行 457
24.3.1 修改命令行路径来满足F#的要求 457
24.3.2 定义基本脚本 458
24.3.3 运行应用程序 458
24.3.4 与F#进行交互 459
24.4 创建F#应用程序 460
24.5 实现自己的设计 462
第25章 创建多线程应用程序 463
25.1 了解多线程 463
25.1.1 定义多线程 464
25.1.2 多线程的优点 465
25.1.3 多线程的缺点 467
25.1.4 多线程的现况 468
25.2 创建基本的多线程应用程序 469
25.2.1 定义项目 469
25.2.2 添加文件处理线程类 470
25.2.3 添加监视线程类 471
25.2.4 开发应用程序代码 475
25.2.5 测试多线程应用程序 478
25.3 实现自己的设计 481
第26章 创建报告和其他输出 483
26.1 定义优秀报告的元素 484
26.1.1 以可接受的报告作为工作的起点 484
26.1.2 将可接受的报告提升到好的水平 485
26.1.3 测试报告 486
26.2 了解用户报告需求 486
26.2.1 内容需求 487
26.2.2 定义格式需求 487
26.2.3 包含机构策略 488
26.2.4 为报告建立用户关系 489
26.3 创建自修改报告 490
26.4 设计其他形式的应用程序输出 491
26.5 实现自己的设计 493
第27章 设计底层应用程序元素 495
27.1 定义P/Invoke 495
27.2 调用外部函数 497
27.2.1 添加所需目录 498
27.2.2 提供结构、枚举和常数 498
27.2.3 创建外部函数引用 501
27.2.4 使用函数调用数据 502
27.2.5 在托管代码中使用外部函数 503
27.2.6 提供错误处理 505
27.3 设计数据结构 510
27.3.1 为标准控制台句柄创建枚举 510
27.3.2 创建基本数据结构 511
27.3.3 定义函数调用 512
27.3.4 在托管代码中采用数据结构 514
27.4 实现自己的设计 515
第Ⅴ部分 资源与工具 519
第28章 选择资源与工具 519
28.1 结束耗时的混乱 519
28.1.1 创建档案 521
28.1.2 有效地对资源和工具升级 522
28.1.3 与供应商建立良好关系 523
28.2 定义有价值的资源 524
28.3 定义有价值的工具 524
28.4 创建团队工具箱 525
28.4.1 了解团队的要求 526
28.4.2 定义使用要求和策略 526
28.5 获取资源与工具 527
第29章 Microsoft资源与工具 529
29.1 寻找Microsoft资源与工具 529
29.1.1 MSDN 530
29.1.2 TechNet 530
29.1.3 使用Microsoft Download 531
29.1.4 微软搜索 532
29.1.5 在线查找资源和工具 533
29.2 用XML Notepad 2007编辑XML文件 535
29.2.1 获得XML Notepad 2007 535
29.2.2 第一次使用XML Notepad 2007 535
29.2.3 修改文件 536
29.2.4 使用XSLT文件 536
29.2.5 比较XML文件 537
29.3 利用Microsoft PowerCommands提高Visual Studio 2008的性能 537
29.4 获取资源与工具 542
第30章 第三方资源与工具 545
30.1 寻找第三方资源与工具 545
30.2 用Vischeck测试应用程序颜色 549
30.3 利用FxCop提高代码的可靠性和一致性 552
30.3.1 获得FxCop 552
30.3.2 使用FxCop GUI 553
30.3.3 修复错误 555
30.3.4 考虑规则 558
30.3.5 在构建期问使用FxCop 558
30.4 利用LINQPad创建LINQ查询 560
30.5 获取资源与工具 562