第Ⅰ部分 设计 3
第1章 创建对象和项目模板 3
1.1 使用对象模板 3
1.2 使用项目模板 5
1.3 编程原则 7
1.3.1 绝不要在对象模板中对应用程序和组件特有的值进行硬编码 7
1.3.2 在对象模板中特别是需修改之处提供广泛的注释和任务 9
第2章 设计模块和过程 11
2.1 创建具有很强内聚性的模块 12
2.2 创建松耦合和高度特定化过程 13
2.2.1 使所有过程都执行特定的功能 13
2.2.2 尽量提高过程的独立性 14
2.2.3 最小化扇入和扇出 15
2.2.4 尽量按字母表顺序排列模块中的过程 16
2.3 编程原则 17
2.3.1 给过程和模块起一个表意性强的名称 17
2.3.2 给每个过程设定惟一的出口 18
2.3.3 给每个过程定义一个明确的范围 20
2.3.4 在过程之间用参数传递数据 21
2.3.5 使用统一和直观明了的方式调用过程 23
2.3.6 使用Return语句返回函数值 25
2.3.7 在复杂函数中使用暂存变量 26
第Ⅱ部分 约定 31
第3章 命名约定 31
3.1 匈牙利表示法 32
3.2 什么情况下不用匈牙利表示法 33
3.3 指明变量的数据类型 34
3.4 指明变量的范围 35
3.5 其他对象前缀 36
第4章 使用常量和枚举 40
4.1 使用常量 40
4.1.1 幻数容易出现数据输入错误 40
4.1.2 幻数难以更新 41
4.1.3 常量使代码更容易阅读 41
4.2 使用枚举 41
4.2.1 创建自定义枚举 42
4.2.2 使用自定义枚举 43
4.3 编程原则 44
4.3.1 给所有常量加上前缀c_和范围指示符 44
4.3.2 用常量代替幻数而不必考虑可见范围 46
4.3.3 尽可能使用枚举 47
4.3.4 参数接收数量有限的值时使用枚举 48
4.3.5 验证作为枚举类型传递的值 48
第5章 变量 52
5.1 编程原则 52
5.1.1 定义用途明确的变量 52
5.1.2 给变量起一个表意性强的名称 56
5.1.3 在变量名中混合使用大小写字母 59
5.1.4 只对常用变量名或长变量名使用缩写 59
5.1.5 使用统一限定词 60
5.1.6 使用肯定形式的Boolean变量 61
5.1.7 显式声明变量 62
5.1.8 用精选的数据类型声明变量 64
5.1.9 只有在绝对必要时才使用Object数据类型 68
5.1.10 使用Option Strict选项严格限制类型 70
5.1.11 最小化变量可见范围 72
5.1.12 尽可能使用初始值设定项 74
5.1.13 使用与号(?)连接字符串 74
5.1.14 用字符串长度属性判断字符串是否为空 75
第Ⅲ部分 编码结构 79
第6章 格式化代码 79
6.1 编程原则 82
6.1.1 不要在同一行中放入多个语句 82
6.1.2 使用续行符 83
6.1.3 缩进连续行 87
6.1.4 使用缩进显示代码的组织结构 90
6.1.5 在模块声明部分缩进代码以显示从属关系 97
6.1.6 用空行把相关的语句分组 98
6.1.7 创建可折叠的代码区域以便管理 104
第7章 注释代码 107
7.1 编程原则 108
7.1.1 用文字说明代码的作用 108
7.1.2 解释为什么要违背良好的编程风格 109
7.1.3 在写代码前先写注释 109
7.1.4 单色字符注释行仅用于主要注释 110
7.1.5 不要创建注释框 112
7.1.6 用撇号表示注释 113
7.1.7 增强注释的可读性 114
7.1.8 缩进注释使之与随后的语句对齐 116
7.1.9 给每个过程写一个注释头 116
7.1.10 用内嵌注释说明代码进程 120
7.1.11 用行尾变量来说明变量声明 125
第8章 循环结构 126
8.1 编程原则 126
8.1.1 循环次数确定时使用For…Next循环 126
8.1.2 循环次数不确定时使用Do…Loop循环 134
8.1.3 用Do…Loop循环代替While…End While 140
8.1.4 使用For Each…Next循环遍历集合中的成员 140
第9章 控制代码流 144
9.1 编程原则 145
9.1.1 判断基于一个条件的值是否为真时使用If…Then…Else分支结构 145
9.1.2 当把一个非Boolean表达式与多个值进行比较时使用Select Case语句 148
9.1.3 使用行尾注释增加嵌套判断结构的清晰度 152
9.1.4 格式化表达式以便准确求值和易于理解 154
9.1.5 仅在别无选择时才使用GoTo语句 156
第10章 异常处理 159
10.1 异常对象 160
10.2 异常处理程序的类型 160
10.3 使用Try…Catch…Finally语句编写异常处理程序 161
10.3.1 捕获异常 163
10.3.2 异常处理程序和调用堆栈 165
10.4 中央异常处理程序 167
10.4.1 把异常写入文本文件 170
10.5 编程原则 173
10.5.1 用Try…Catch…Finally处理不可预料的和可预料的异常 173
10.5.2 处理不可预料的异常时使用统一的格式 174
10.5.3 永远不要指责用户 175
第Ⅳ部分 高级编程 179
第11章 编程对象 179
11.1 什么是对象 179
11.2 垃圾回收 180
11.3 编程原则 181
11.3.1 要尽早绑定对象 181
11.3.2 要尽可能使用NET对象而不是调用API函数 183
11.3.3 公开公共属性而不是公开公共变量 184
11.3.4 无论打开什么资源都要关闭它们 186
11.3.5 使用OverLoads创建名称相同但参数列表不同的属性和方法 186
11.3.6 为所有对象创建Dispose方法 188
11.3.7 要尽可能为类创建构造函数 190
11.3.8 仅在必要时才在类中添加终结器 192
11.3.9 仅在必要时才强制执行垃圾回收 194
11.3.10 使用With…End With提高性能和代码的可读性 194
第12章 文件操作 196
12.1 System.IO 196
12.1.1 System.IO.File和System.IO.Directory 196
12.1.2 System.IO.Path 200
12.2 System.Environment 201
12.3 编程原则 202
12.3.1 把所有临时文件都保存在用户的Temp文件夹中 202
12.3.2 用系统指定的临时文件名保存临时文件 203
12.3.3 及时关闭不再需要访问的文件 204
12.3.4 决不要在程序中使用硬编码路径 206
12.3.5 使用System.IO.Path来操纵文件路径 206
12.3.6 文件的默认保存路径为用户的My Documents文件夹 207
12.3.7 将文件添加到用户最近用过的文档列表中 207
12.3.8 删除重要文件时请求确认 208
第13章 调试 210
13.1 从Visual Basic 6到Visual Basic.NET 210
13.1.1 用数据提示查看表达式的值 210
13.1.2 用Debug.Assert定义断言 211
13.2 条件编译 214
13.2.1 编写条件编译代码 214
13.2.2 用项目【属性页】对话框设置编译器常量 216
13.2.3 用命令行设置编译器常量 216
13.3 断点 217
13.3.1 设置和删除断点 217
13.3.2 进入中断模式 217
13.3.3 使用【断点】窗口管理断点 219
13.3.4 用Stop语句进入中断模式 222
13.4 Visual Basic.NET调试窗口 222
13.4.1 【自动】窗口 223
13.4.2 【局部变量】窗口 224
13.4.3 Me窗口 224
13.4.4 【监视】窗口 225
13.4.5 【快速监视】窗口 226
13.4.6 【命令】窗口 226
13.4.7 【输出】窗口 228
13.4.8 【任务列表】窗口 229
13.4.9 【模块】窗口 231
13.4.10 【内存】窗口 231
13.4.11 【调用堆栈】窗口 231
13.5 编程原则 233
13.5.1 启动项目时不进行调试而不是删除或禁用调试代码 233
13.5.2 当调用Debug.Assert时不要创建修改数据的表达式 234
13.5.3 断言目的不明确时要指定自定义断言文本 234
13.5.4 尽可能使用Option Strict选项 235
13.5.5 给全部过程都加上异常处理代码 235
13.5.6 在条件编译的调试代码中使用固有的DEBUG常量 235
13.5.7 用断点来确保复杂的过程得到完全执行 235
13.5.8 尽可能使用断点而不要使用Stop语句 235
13.5.9 创建注释作为TODO任务 236
第Ⅴ部分 用户交互 239
第14章 界面设计 239
14.1 设计一致界面的必要性 239
14.2 编程原则 241
14.2.1 使所有窗体具有一致的外观和行为 241
14.2.2 用标准的外观显示控件 255
14.2.3 根据具体情况使用最好的界面组件 262
14.2.4 提供可理解并且有意义的菜单 268
14.2.5 尽可能使用系统颜色 274
第15章 用户输入与通知 278
15.1 用户输入 278
15.2 通知 279
15.3 编程原则 280
15.3.1 确保完整的键盘导航与交互 280
15.3.2 提供直观一致的鼠标交互 284
15.3.3 创建有意义且实用的消息框 290
15.3.4 如果应用程序允许用户打开并保存很多文件则应用程序应记住用户所选的路径 296
第16章 发布解决方案 297
16.1 准备要发布的项目 297
16.2 创建自定义安装程序 297
16.2.1 添加项目的输出 299
16.2.2 定义项目输出的生成选项 303
16.2.3 向安装程序中添加文件 303
16.2.4 文件属性 304
16.2.5 改变【应用程序文件夹】的默认位置 305
16.2.6 使用目标计算机上的文件夹 307
16.2.7 改变文件的安装文件夹 309
16.2.8 创建快捷方式 310
16.2.9 在安装过程中修改注册表 310
16.2.10 修改自定义安装程序的用户界面 311
16.2.11 指定配置细节 312
16.2.12 指定卸载信息 314
16.2.13 建立自定义安装程序 316
16.3 编程原则 317
16.3.1 对界面进行拼写检查 317
16.3.2 调整窗体上控件的对齐方式 317
16.3.3 测试所有窗体的Tab键顺序 317
16.3.4 检查重复的访问键 317
16.3.5 检查所有对话框的接受和取消按钮 318
16.3.6 检查消息对话框的格式 318
16.3.7 确保每一个过程都有异常处理程序 318
16.3.8 核实所使用第3方组件的版本是否正确 318
16.3.9 为所有已发布的程序指定逻辑的根命名空间 318
16.3.10 对程序进行彻底的测试与调试 319
16.3.11 检查条件编译常量 319
16.3.12 不要将文件安装到用户的桌面上 319
16.3.13 不要将快捷方式直接放在Program Files文件夹中 319
16.3.14 除非能够确定所有目标计算机安装了恰当的Windows Installer否则应该包含引导程序 319
16.3.15 将安装项目命名为“程序名Installer” 320
16.3.16 为项目设置合适的版本号 320
16.3.17 为每个已安装的组件创建一个有意义的图标 320
16.3.18 务必将路径[ProgramFilesFloder][Manufacturer]\[ProductName]作为默认的【应用程序文件夹】 320
16.3.19 除非有特殊原因,否则应在【应用程序文件夹】中创建所有自定义文件夹 320
16.3.20 只在需要时包含调试信息 320
16.3.21 将所有COM文件的SharedLegacy属性设置为True 321
16.3.22 将关键文件的Vital属性设置为True 321
16.3.23 为安装程序项目设置合适的生成顺序 321
16.3.24 除非有特殊原因,否则应将创建的所有自定义注册表键值设置为DeleteAtUninstall 322
第Ⅵ部分 团队项目 325
第17章 版本管理 325
17.1 了解程序集 325
17.2 编程原则 329
17.2.1 每次编译程序时递增版本号 329
17.2.2 在【关于】对话框中显示程序的版本号 330
17.2.3 将组件安装在与客户端使用该组件相同的文件夹中 331
17.2.4 推出组件的新版本时要保持兼容性 331
17.2.5 修改Readme文件中的内容 334
17.2.6 备份自己的文件 334
17.2.7 使用Visual SourceSafe维护源代码的版本 335
第18章 源代码管理 336
18.1 确定团队开发所面临的挑战 336
18.2 了解Visual SourceSafe 337
18.3 设置Visual SourceSafe 338
18.3.1 创建Visual SourceSafe数据库 338
18.3.2 打开Visual SourceSafe Database 340
18.3.3 向Visual SourceSafe数据库中添加用户 341
18.3.4 将Visual Basic项目置于Visual SourceSafe的管理之下 342
18.4 Visual Basic项目与Visual SourceSafe 344
18.4.1 指定工作文件夹 344
18.4.2 创建项目的工作副本 346
18.4.3 通过Visual SourceSafe Explorer签出文件 346
18.4.4 从Visual Basic IDE中签入和签出文件 349
18.4.5 向源代码处于管制中的项目添加新文件 351
18.4.6 获得文件的最新版本 351
18.4.7 比较修订 353