第1章 准备工作 1
1.1 为什么要编写程序 1
1.2 C#与.NET框架的关系 2
1.3 开发工具——Visual Studio 3
1.3.1 下载和安装 3
1.3.2 认识Visual Studio 3
1.3.3 使用快捷键 4
1.3.4 放置子窗口 4
1.3.5 自动隐藏窗口 5
1.3.6 快速启动 6
1.3.7 个性化设置 7
1.4 创建第一个应用程序 12
1.5 解决方案与项目的关系 15
第2章 语法基础 17
2.1 代码的基本结构 17
2.2 命名空间 18
2.2.1 为什么要使用命名空间 18
2.2.2 如何访问命名空间中的成员 19
2.2.3 引入命名空间 19
2.3 Main入口点 20
2.3.1 程序代码真的从Main方法开始执行吗 21
2.3.2 如何选择入口点 21
2.4 变量与常量 23
2.4.1 变量 23
2.4.2 变量的生命周期 24
2.4.3 常量 24
2.5 命名规则 25
2.6 运算符 26
2.6.1 示例:简单运算 26
2.6.2 示例:自增和自减运算 27
2.6.3 示例:位运算 28
2.6.4 示例:比较运算符 29
2.7 流程控制 30
2.7.1 顺序执行 31
2.7.2 有选择地执行 31
2.7.3 循环往复 34
2.8 写注释是个好习惯 39
2.9 基本的数据类型 40
2.10 不要错过《C#语言规范》文档 42
第3章 面向对象编程 44
3.1 类 44
3.1.1 字段 45
3.1.2 属性 45
3.1.3 方法 47
3.1.4 构造函数与析构函数 49
3.2 结构 53
3.3 引用类型与值类型 55
3.4 ref参数与out参数 57
3.5 方法重载 62
3.6 静态类与静态成员 63
3.7 继承与多态 64
3.7.1 可访问性 65
3.7.2 继承 67
3.7.3 注意可访问性要一致 69
3.7.4 隐藏基类的成员 70
3.7.5 覆写基类成员 71
3.7.6 如何阻止类被继承 73
3.8 抽象类 74
3.9 接口 77
3.9.1 定义接口 78
3.9.2 接口与多继承 78
3.9.3 实现接口 78
3.9.4 显式实现接口 80
3.10 扩展方法 82
3.11 委托与事件 83
3.11.1 定义和使用委托 83
3.11.2 将方法作为参数传递 85
3.11.3 使用事件 86
3.12 枚举 91
3.12.1 使用枚举类型 92
3.12.2 如何获取枚举的值列表 94
3.12.3 如何取得枚举各成员的名字 95
3.12.4 枚举的位运算 96
3.13 特性 99
3.13.1 自定义特性 100
3.13.2 如何把特性应用到方法的返回值 101
3.13.3 通过反射技术检索特性 102
3.14 数组 103
3.14.1 定义数组的几种方法 103
3.14.2 多维数组 105
3.14.3 嵌套数组 107
3.14.4 复制数组 109
3.14.5 反转数组 111
3.14.6 更改数组的大小 111
3.14.7 在数组中查找元素 112
3.14.8 灵活使用ArrayList类 116
第4章 控制台应用程序 118
4.1 输出文本信息 118
4.2 获取键盘输入 120
4.2.1 Read方法 120
4.2.2 ReadKey方法 121
4.2.3 ReadLine方法 122
4.3 命令行参数 123
4.4 设置控制台窗口的外观 125
4.5 控制台窗口的大小和位置 126
第5章 字符串处理与数学运算 131
5.1 对象的字符串表示形式 131
5.1.1 重写ToString方法 131
5.1.2 扩展方法 133
5.2 字符串的串联与拆分 135
5.2.1 使用+运算符来串联字符串 135
5.2.2 使用Join方法拼接字符串数组 136
5.2.3 使用Concat方法创建字符串 136
5.2.4 使用StringBuilder类来创建字符串 137
5.2.5 使用Split方法来拆分字符串 140
5.3 转义字符 141
5.4 英文字母的大小写转换 143
5.5 Parse和TryParse方法 143
5.6 查找和修改字符串 145
5.6.1 查找索引 146
5.6.2 存在性查找 147
5.6.3 字符串的增删改 148
5.6.4 填充字符串 150
5.7 格式化字符串 151
5.7.1 IformatProvider接口 151
5.7.2 区域性相关的信息 152
5.7.3 实现字符串的格式化 153
5.8 字符串的复合格式化 160
5.9 生成随机数 161
5.10 Math类与常用的数学运算 162
5.11 与日期时间有关的计算 163
第6章 类型转换 165
6.1 隐式转换 165
6.2 显式转换 167
6.3 可以为null的类型 169
6.4 引用类型的兼容性转换 170
6.5 类型转换帮助器 172
6.6 自定义转换 175
第7章 泛型、集合与变体 178
7.1 泛型类型 178
7.1.1 泛型与类 179
7.1.2 泛型与接口 180
7.1.3 泛型与类型成员 182
7.1.4 泛型与委托 183
7.1.5 泛型约束 186
7.2 集合 189
7.2.1 普通集合 190
7.2.2 泛型集合 192
7.2.3 字典 200
7.3 自定义排序 205
7.4 变体 208
7.4.1 协变与逆变 209
7.4.2 类型参数的输入与输出 211
7.4.3 必不可少的技巧 214
第8章 纠错与单元测试 216
8.1 实时纠正语法错误 216
8.2 代码调试 218
8.2.1 断点法 218
8.2.2 输出信息法 220
8.3 断言 222
8.4 使用日志文件 225
8.5 异常处理 229
8.6 单元测试 232
第9章 匿名方法与Lambda表达式 237
9.1 匿名方法 237
9.2 Lambda表达式 238
9.2.1 用于赋值 239
9.2.2 用于参数传递 240
第10章 集成化查询 245
10.1 LINQ基本语法 245
10.1.1 对查询结果类型的巧妙处理 246
10.1.2 延迟执行与强制立即执行 248
10.2 筛选 250
10.3 排序 251
10.4 分组 253
10.5 更复杂的查询 257
10.5.1 动态创建类型 258
10.5.2 联合查询 259
10.5.3 嵌套查询 265
第11章 Windows窗体应用程序 269
11.1 Windows窗体应用程序的基本结构 269
11.1.1 客户区域 270
11.1.2 控件 270
11.1.3 应用程序项目 270
11.1.4 Windows消息循环 272
11.1.5 演练:手动创建一个Windows应用程序 275
11.2 ApplicationContext类 278
11.3 窗体设计器 280
11.4 控件的基类——Control 285
11.4.1 示例:设置控件的位置和大小 286
11.4.2 示例:设置控件的前景色和背景色 289
11.4.3 示例:调整控件的Z顺序 291
11.5 常规控件 295
11.5.1 共享事件处理程序 295
11.5.2 制作“用户登录”窗口 296
11.5.3 CheckBox与RadioButton示例 299
11.5.4 使用ListBox控件呈现对象列表 302
11.5.5 自行绘制列表控件的项 308
11.5.6 组合框 311
11.5.7 TextBox的自动完成功能 313
11.5.8 多视图列表 314
11.5.9 图像呈现控件 320
11.5.10 实时报告进度 327
11.5.11 选择日期和时间 333
11.5.12 规范用户输入 335
11.6 容器控件 340
11.6.1 在容器内部显示滚动条 340
11.6.2 分组面板 341
11.6.3 网格布局面板 342
11.6.4 选项卡 345
11.6.5 自动排列内容的面板 349
11.7 工具栏和菜单 351
11.7.1 工具栏 351
11.7.2 菜单栏 355
11.7.3 上下文菜单 358
11.7.4 自定义承载控件 359
11.8 对话框 363
11.8.1 “打开文件”和“保存文件”对话框 363
11.8.2 字体选择对话框 367
11.8.3 颜色选择对话框 369
11.8.4 自定义对话框 370
11.9 用户控件 375
11.10 自定义控件 376
第12章 WPF应用程序 382
12.1 WPF应用程序项目的结构 382
12.2 XAML基础 386
12.2.1 XAML命名空间 386
12.2.2 代码隐藏 387
12.2.3 标记扩展 387
12.2.4 内容属性 389
12.3 依赖项属性 391
12.3.1 定义和使用依赖项属性 392
12.3.2 使用元数据 395
12.3.3 使用已注册的依赖项属性 400
12.3.4 只读依赖项属性 403
12.3.5 附加属性 405
12.4 路由事件 409
12.4.1 路由策略 412
12.4.2 注册路由事件的类处理程序 414
12.5 认识WPF控件 417
12.5.1 Control类 417
12.5.2 内容控件 421
12.5.3 输入控件 429
12.6 数据绑定与视图呈现 431
12.6.1 用于数据绑定的XAML扩展标记 432
12.6.2 使用InotifyPropertyChanged接口 438
12.6.3 上下文绑定 443
12.6.4 绑定转换器 449
12.6.5 数据集合控件 451
12.6.6 数据模板 456
12.6.7 数据视图 465
12.6.8 ObservableCollection<T>集合 476
12.7 布局 479
12.7.1 Panel类 479
12.7.2 网格布局(Grid) 481
12.7.3 栈布局(StackPanel) 485
12.7.4 停靠面板(DockPanel) 486
12.7.5 绝对定位(Canvas) 487
12.7.6 自动换行(WrapPanel) 489
12.7.7 Z顺序 490
12.8 用户控件与自定义控件 491
12.9 样式与资源 500
12.9.1 样式中的触发器 501
12.9.2 资源的有效范围 503
12.9.3 合并资源字典 505
12.9.4 静态资源与动态资源 508
12.10 图形 509
12.10.1 Shape类 509
12.10.2 基本图形 514
12.11 动画 516
12.11.1 演示图板 516
12.11.2 简单动画与关键帧动画 518
第13章 异步编程 522
13.1 为什么要使用异步编程 522
13.2 使用Thread类进行异步编程 525
13.3 线程锁 527
13.4 通过委托执行异步操作 530
13.5 并行任务 533
13.5.1 启动简单的并行任务 533
13.5.2 Task与Task<TResult>类 538
13.5.3 创建可取消的Task 540
13.6 async和await关键字 542
第14章 系统信息管理 548
14.1 管理进程 548
14.1.1 管理现有进程 548
14.1.2 启动新进程 552
14.1.3 重定向输入/输出流 554
14.2 管理服务 556
14.3 WMI查询 563
14.4 读取系统参数 567
14.4.1 ComputerInfo类 568
14.4.2 Environment类 569
14.4.3 SystemInformation类 570
14.4.4 用于WPF的系统信息类 571
14.5 写入事件日志 572
第15章 文件与流 575
15.1 创建和删除目录 575
15.2 创建和删除文件 577
15.3 流 578
15.3.1 读写文件 579
15.3.2 内存流 584
15.4 内存映射文件 587
15.5 监控文件系统的变化 590
15.6 独立存储 592
15.7 压缩与解压缩 595
第16章 序列化与反序列化 600
16.1 二进制序列化 600
16.2 XML序列化 603
16.2.1 简单实现XML序列化和反序列化 604
16.2.2 自定义XML文档的节点 605
16.3 SOAP序列化 609
16.4 数据协定 610
16.5 JSON序列化 615
第17章 访问数据库 617
17.1 SQLLocalDB与SSDT 617
17.1.1 创建和删除数据服务实例 618
17.1.2 在Visual Studio中连接和创建数据库 620
17.1.3 编写SQL语句 622
17.2 示例数据库 624
17.3 连接数据库 625
17.4 ADO.NET基础 628
17.4.1 使用DataReader来读取数据 628
17.4.2 使用DataAdapter填充数据 630
17.4.3 使用数据适配器更新数据库 632
17.4.4 参数化查询 635
17.5 LinQ to ADO.NET 638
17.6 LinQ to SQL 641
17.6.1 用DataContext直接执行SQL语句 648
17.6.2 动态创建数据库 649
第18章 程序集与反射 655
18.1 类库 655
18.2 反射技术基础 660
18.2.1 动态加载程序集 660
18.2.2 获取类型信息 662
18.2.3 动态创建类型实例 664
18.2.4 动态调用类型成员 666
第19章 网络编程 671
19.1 Socket编程 671
19.1.1 Socket类 672
19.1.2 TcpListener类与TcpClient类 676
19.1.3 UdpClient类 678
19.2 HTTP通信 681
19.2.1 HttpWebRequest类与HttpWebResponse类 681
19.2.2 WebClient类 683
19.2.3 HttpClient类 685
19.3 获取网络接口信息 689
19.4 向目标计算机发送Ping命令 690
19.5 用SMTP发送电子邮件 690
19.6 访问Web服务 693
第20章 互操作性 696
20.1 调用Win32 API函数 696
20.2 调用COM组件 699