第Ⅰ部分 对象ABC 3
第1章 初步体验C# 3
1.1 C#入门指南 4
1.2 使用C#的原因 4
1.2.1 实践出真知 4
1.2.2 C#是集成应用开发架构的一部分 4
1.2.3 C#是彻底的面向对象语言 5
1.2.4 C#是免费的语言 5
1.3 C#语言基础 6
1.4 详细分析一个简单的C#程序 6
1.4.1 “using System;”语句 7
1.4.2 注释 7
1.4.3 类声明/“包装器” 8
1.4.4 Main方法 8
1.5 预定义类型 9
1.6 变量 10
1.6.1 变量的命名约定 11
1.6.2 变量初始化和赋值 11
1.7 字符串 12
1.8 区分大小写 13
1.9 C#表达式 13
1.9.1 赋值语句 13
1.9.2 算术运算符 14
1.9.3 求值表达式和运算符优先级 16
1.9.4 逻辑运算符 16
1.10 隐式类型转换和显式类型转换 18
1.11 循环和其他流程控制结构 19
1.11.1 if语句 19
1.11.2 switch语句 22
1.11.3 for语句 25
1.11.4 while语句 28
1.11.5 do语句 29
1.12 跳出语句 29
1.13 代码块和变量作用域 31
1.14 输出到屏幕 32
1.14.1 Write和WriteLine的对比 34
1.14.2 转义序列 35
1.15 C#样式的要素 36
1.15.1 适当地使用缩进 36
1.15.2 明智地使用注释 39
1.15.3 大括号的放置 40
1.15.4 自说明的变量名 42
1.16 本章小结 42
1.17 练习 43
第2章 抽象和建模 45
2.1 通过抽象进行简化 45
2.2 通过抽象进行概括 46
2.2.1 将抽象模型组织为分类层次结构 47
2.2.2 作为软件开发基础的抽象 50
2.3 抽象的重用 51
2.4 固有的挑战 51
2.5 本章小结 53
2.6 练习 54
第3章 对象和类 55
3.1 对象的概念 55
3.2 状态/字段/数据 56
3.3 行为/操作/方法 57
3.4 类 58
3.4.1 关于命名约定的说明 59
3.4.2 实例化 59
3.5 用户定义类型和引用变量 61
3.6 实例化对象:深入研究 62
3.7 作为字段的对象 65
3.8 关联 66
3.9 面向对象编程语言的3个特性 68
3.10 本章小结 69
3.11 练习 69
第4章 对象交互 71
4.1 事件驱动对象协作 71
4.2 声明方法 72
4.2.1 方法头 73
4.2.2 向方法传递参数 73
4.2.3 方法返回类型 74
4.2.4 方法体 75
4.2.5 方法实现业务规则 76
4.2.6 return语句 76
4.2.7 命名建议 78
4.3 方法调用和点记号法 79
4.3.1 实参与形参 79
4.3.2 作为方法调用上下文的对象 80
4.3.3 再论C#表达式 82
4.3.4 获取方法调用的返回值 82
4.3.5 方法签名 83
4.3.6 对象通过方法交互 84
4.3.7 通过点记号法访问字段 85
4.3.8 委托 86
4.3.9 访问对象 87
4.3.10 作为客户和服务提供者的对象 89
4.4 信息隐藏/可访问性 90
4.4.1 可访问性的类型 91
4.4.2 在类方法内部访问类的成员 95
4.4.3 再论Camel命名法和Pascal命名法 96
4.4.4 再论方法头 97
4.4.5 从客户代码访问私有成员 97
4.4.6 字段值的持久性 104
4.4.7 公有/私有规则的例外 104
4.5 封装的强大功能 107
4.5.1 防止对封装数据未经授权的访问 107
4.5.2 帮助确保数据完整性 108
4.5.3 当私有成员更改时限制连锁反应 109
4.5.4 在类的自身方法中使用存取器 112
4.6 构造函数 114
4.6.1 默认构造函数 114
4.6.2 编写自己的构造函数 115
4.6.3 向构造函数传递参数 116
4.7 本章小结 118
4.8 练习 118
第5章 对象间的关系 121
5.1 关联和链接 121
5.1.1 多样性 123
5.1.2 聚集 125
5.1.3 继承 126
5.1.4 继承的优点 133
5.1.5 继承的缺点 133
5.1.6 类的层次结构 134
5.1.7 继承是否真是一种关系 135
5.1.8 避免“连锁反应” 136
5.1.9 派生类的规则:可为 136
5.1.10 派生类的规则:不可为 140
5.1.11 重载 141
5.2 略谈多重继承 144
5.3 回顾面向对象编程语言的3个显著特点 147
5.4 本章小结 147
5.5 练习 148
第6章 对象集合 151
6.1 集合的定义 151
6.1.1 在初次使用集合之前必须对其进行实例化 152
6.1.2 通过类定义集合 154
6.1.3 封装OO集合 154
6.2 作为简单集合的数组 155
6.2.1 声明和实例化数组 155
6.2.2 访问单个数组元素 155
6.2.3 初始化数组内容 156
6.2.4 操作对象数组 157
6.2.5 其他数组考虑事项 159
6.2.6 多维数组 160
6.3 更复杂的集合类型 162
6.3.1 有序列表 163
6.3.2 组 164
6.3.3 字典 165
6.3.4 泛型集合 166
6.3.5 多个集合同时引用同一个对象 167
6.4 作为方法返回类型的集合 168
6.5 超类型的集合 170
6.6 再论组合类 171
6.6.1 courseLoad 171
6.6.2 transcript,方法一 172
6.6.3 transcript,方法二 173
6.6.4 完整的Student数据结构 174
6.7 本章小结 174
6.8 练习 175
第7章 多态和最后一些对象概念 177
7.1 多态的定义 177
7.2 OOPL的3种与众不同的功能 184
7.3 抽象类 185
7.3.1 抽象类和实例化 188
7.3.2 重写抽象方法 189
7.3.3 打破抽象的咒语 190
7.4 接口 192
7.4.1 实现接口 193
7.4.2 “是一个”关系的另一种形式 195
7.4.3 抽象类与接口的对比 195
7.4.4 实现多个接口 197
7.4.5 接口和实例化 200
7.4.6 接口的重要性 200
7.5 静态成员 203
7.5.1 静态字段 203
7.5.2 静态属性 207
7.5.3 静态方法 208
7.5.4 静态方法和属性的限制 210
7.5.5 C#的特有术语 212
7.6 实用程序类 212
7.6.1 用户定义的实用程序类 213
7.6.2 常量 215
7.6.3 只读字段 217
7.7 本章小结 217
7.8 练习 218
第Ⅱ部分 对象建模 101
第8章 对象建模过程简述 223
8.1 对象建模的目标 223
8.2 对象建模过程概述 226
8.2.1 关于对象建模软件工具的思考 227
8.2.2 提醒 229
8.3 本章小结 229
8.4 练习 229
第9章 通过用例规范化需求 231
9.1 用例的概念 231
9.1.1 功能需求和技术需求 232
9.1.2 让用户参与 232
9.2 参与者 233
9.2.1 确定参与者并定义其角色 233
9.2.2 为系统和参与者绘制用例图 234
9.3 指定用例 236
9.4 匹配参与者和用例 238
9.5 是否绘制用例图 238
9.6 本章小结 239
9.7 练习 240
第10章 对系统的静态/数据方面进行建模 241
10.1 确定合适的类 242
10.1.1 名词短语分析 242
10.1.2 回顾用例 250
10.2 生成数据字典 251
10.3 确定类间关联 252
10.4 确定字段 255
10.5 UML符号:对抽象模型的静态方面进行建模 256
10.5.1 类、字段和操作 256
10.5.2 类问关系 257
10.5.3 说明多样性 261
10.6 对象图 264
10.7 信息“流”过关联“管道” 266
10.8 “混合和匹配”关系符号 270
10.9 关联类 272
10.10 完成后的SRS类图 274
10.11 继承还是关联 278
10.12 本章小结 279
10.13 练习 280
第11章 对系统的动态/行为方面进行建模 281
11.1 行为影响状态的方式 281
11.2 场景 286
11.2.1 场景1:“注册课程”用例 287
11.2.2 场景2:“注册课程”用例 288
11.3 时序图 289
11.3.1 确定场景1的对象和外部参与者 289
11.3.2 准备时序图 290
11.4 使用时序图确定方法 293
11.5 协作图 295
11.6 修改后的SRS类图 296
11.7 本章小结 297
11.8 练习 297
第12章 建模总结 299
12.1 测试模型 299
12.2 回顾需求 300
12.3 重用模型:设计模式 302
12.4 本章小结 304
12.5 练习 304
第Ⅲ部分 将UML“蓝图”转换为C#代码 307
第13章 深入学习C# 307
13.1 名称空间 308
13.1.1 程序员自定义的名称空间 311
13.1.2 全局名称空间 313
13.2 作为对象的字符串 314
13.2.1 string别名 314
13.2.2 创建String实例 315
13.2.3 @字符 316
13.2.4 特殊的string操作符 316
13.2.5 String属性 317
13.2.6 String方法 317
13.3 Object类 319
13.3.1 Equals方法 320
13.3.2 ToString方法 323
13.4 使用this进行对象的自身引用 325
13.5 C#集合类 326
13.5.1 再论数组 327
13.5.2 List类 329
13.5.3 Dictionary类 333
13.5.4 使用foreach循环迭代访问集合 335
13.6 再论字段 337
13.6.1 再论变量初始化 337
13.6.2 隐式输入的局部变量 338
13.7 再论Main方法 339
13.7.1 Main方法的几种形式 339
13.7.2 静态Main方法 340
13.8 再论输出到屏幕 341
13.9 再论构造函数 342
13.9.1 重载构造函数 343
13.9.2 替换默认的无参数构造函数 343
13.9.3 在类中重用构造函数代码 346
13.10 更多关于继承和C#的知识 347
13.10.1 继承组件的可访问性 348
13.10.2 重用基类行为:base关键字 350
13.10.3 继承和构造函数 352
13.10.4 base()的隐式调用 354
13.10.5 对象初始化器 357
13.11 再论方法 358
13.11.1 消息链 358
13.11.2 方法隐藏 360
13.12 再论属性 362
13.12.1 非对称的可访问性 362
13.12.2 自动实现的属性 363
13.12.3 回顾重写和抽象类 365
13.13 对象标识 365
13.13.1 派生类的对象也是基类的对象 366
13.13.2 确定对象所属的类 368
13.14 对象删除和垃圾回收 370
13.15 属性 371
13.16 本章小结 372
13.17 练习 373
第14章 将UML模型转换成C#代码 375
14.1 充分利用本章和后面的章节 375
14.2 开发命令行驱动的应用程序 376
14.2.1 读取命令行参数 376
14.2.2 接受键盘输入 377
14.3 回顾SRS类图 379
14.3.1 SRS的开发计划 381
14.3.2 Person类(指定抽象类) 382
14.3.3 Student类(通过继承重用,扩展抽象类,委托) 385
14.3.4 Professor类(双向关系) 391
14.3.5 Course类(反身和单向关系) 394
14.3.6 Section类(表示关联类和公有常量字段) 397
14.3.7 再论委托 405
14.3.8 ScheduleOfClasses类 409
14.3.9 TranscriptEntry关联类(静态方法) 411
14.3.10 SRS驱动程序 416
14.3.11 编译SRS程序 422
14.4 本章小结 427
14.5 练习 427
第15章 完善应用程序Ⅰ:增加文件持久化特性&. 429
15.1 持久化(Persistence)的概念 430
15.2 C#异常处理 431
15.2.1 异常处理机制 432
15.2.2 Exception类的层次结构 436
15.2.3 catch子句的顺序匹配 436
15.2.4 catch代码块的正确顺序 437
15.2.5 引用抛出的Exception对象 438
15.2.6 用户自定义异常 438
15.2.7 编译器强制的异常处理 441
15.3 从文件中读取数据或向文件写入数据 442
15.3.1 FileStream类 442
15.3.2 从文件中读取数据 442
15.3.3 向文件写入数据 445
15.3.4 填充主要的SRS集合 447
15.3.5 持久化Student数据 449
15.3.6 不持久化其他对象类型的原因 450
15.4 SRS类的通用I/O方法 450
15.5 CourseCatalog类 451
15.5.1 构造函数 451
15.5.2 Display方法 452
15.5.3 AddCourse方法 452
15.5.4 FindCourse方法 452
15.5.5 ReadCourseCatalogData方法 453
15.5.6 ReadPrerequisitesData方法 455
15.5.7 添加Main方法 457
15.6 更改ScheduleOfClasses类 459
15.6.1 更改构造函数 459
15.6.2 FindSection方法 460
15.6.3 ReadScheduleData方法 460
15.6.4 测试修改后的ScheduleOfClasses类 462
15.7 Faculty类 464
15.7.1 FindProfessor方法 464
15.7.2 ReadAssignmentData方法 464
15.7.3 添加Main方法 465
15.8 修改Course类 467
15.9 Student类(动态数据检索;持久化对象状态) 468
15.9.1 更改Student类的构造函数 469
15.9.2 ReadStudentData方法 469
15.9.3 持久化Student对象的状态 471
15.10 二进制I/O 472
15.11 回顾SRS类 472
15.12 本章小结 480
15.13 练习 481
第16章 完善应用程序Ⅱ:添加图形用户界面&. 483
16.1 C#GUI:入门 484
16.1.1 容器 484
16.1.2 事件驱动的GUI 485
16.1.3 System.Windows.Forms和System.Drawing名称空间 485
16.1.4 从视图中分离模型 486
16.1.5 学习路线 489
16.2 第一阶段:为SRS GUI准备操作概念文档 489
16.3 第二阶段:创建GUI的外观 496
16.3.1 Form类 497
16.3.2 GUI的应用程序体系结构 501
16.3.3 Label类 504
16.3.4 TextBox类 509
16.3.5 ListBox类 511
16.3.6 Button类 514
16.3.7 创建模态消息对话框 517
16.3.8 创建口令对话框 518
16.3.9 视图已完成 521
16.4 第三阶段:通过事件处理添加功能 521
16.4.1 C#事件模型 521
16.4.2 使用委托进行GUI事件处理 525
16.4.3 将事件处理添加到SRS GUI 531
16.5 本章小结 551
16.6 练习 551
第17章 下一步 553
17.1 有效学习C#的可靠方法 553
17.2 推荐读物 554
17.3 请赐评论 555
附录A 安装.NET和编译C#程序 557
附录B 下载和编译SRS源代码 571