前言 1
第1章 数字与枚举 11
1.0 引言 11
1.1 确定分数与浮点数值之间的近似相等性 13
1.2 度转换为弧度 15
1.3 弧度转换为度 15
1.4 对各种数据类型使用反码操作符 16
1.5 测试奇偶值 17
1.6 得到一个数的高字或低字 19
1.7 将其他进制的数转换为十进制数 20
1.8 确定一个串是否是一个合法数字 21
1.9 浮点数值取整 22
1.10 选择取整算法 23
1.11 摄氏温度转换为华氏温度 24
1.12 华氏温度转换为摄氏温度 24
1.13 安全地执行窄化数值强制转换 25
1.14 得出直角三角形任意三边的边长 27
1.15 得出直角三角形的角度 29
1.16 将枚举值显示为一个串 30
1.17 将纯文本转换为一个等价的枚举值 32
1.18 测试一个合法的枚举值 34
1.19 测试是否为合法的标志枚举 36
1.20 在位掩码中使用枚举成员 38
1.21 确定是否设置了一个或多个枚举标志 40
1.23 确定一个Decimal或Double的整数部分 44
第2章 串和字符 45
2.0 引言 45
2.1 确定一个char包含何种字符 45
2.2 确定一个字符是否在指定范围内 49
2.3 比较两个字符时控制大小写敏感性 50
2.4 找出字符在串中的所有出现 52
2.5 找出一个串在另一个串中的所有出现的位置 54
2.6 实现一个简单的词法分析器解构一个串 59
2.7 比较两个串时控制大小写敏感性 61
2.8 将一个串与第二个串的开头或结尾进行比较 62
2.9 在串中插入文本 63
2.10 删除或替换串中的字符 64
2.11 将二进制数据编码为Base64 67
2.12 对Base64编码的二进制数据解码 68
2.13 将作为Byte[]返回的一个串转换回String 69
2.14 将一个String传递给只接受byte[]的方法 70
2.15 将串转换为其他类型 72
2.16 格式化串中的数据 76
2.17 创建一个定界串 79
2.18 从定界串抽取项 80
2.19 设置StringBuilder所能包含的最大字符数 81
2.20 迭代处理串中的各个字符 83
2.21 改善串比较性能 84
2.22 改善StringBuilder的性能 87
2.23 去掉串开头和/或结尾的字符 90
2.24 测试一个串是否为Null或空串 91
2.25 追加一行 92
2.26 大块数据的编码 93
第3章 类和结构 99
3.0 引言 99
3.1 创建联合类型的结构 101
3.2 允许一个类型将自身表示为String 103
3.3 将一个对象的串表示转换为实际对象 109
3.4 利用抽象基类实现多态 113
3.5 使类型可排序 119
3.6 使类型可搜索 124
3.7 间接重载+=、-=、/=和*=操作符 129
3.8 间接重载&&、||和?:操作符 132
3.9 打开或关闭位 135
3.10 建立无错表达式 138
3.11 最小化(减少)布尔逻辑 141
3.12 以独立于语言的方式实现简单类型间的转换 145
3.13 确定何时使用强制转换操作符、as操作符或is操作符 152
3.14 用as操作符强制转换 153
3.15 用is操作符确定一个变量的类型 156
3.16 用接口实现多态 159
3.17 在多个对象类型上调用相同的方法 162
3.18 使用接口增加通知回调 165
3.19 使用多个入口点实现应用版本化 173
3.20 避免创建仅部分初始化的对象 175
3.21 从一个方法返回多项 177
3.22 解析命令行参数 179
3.23 改进类以与COM互操作 188
3.24 在运行时初始化一个常量字段 193
3.25 编写与所有托管语言兼容的代码 196
3.26 构建可复制类 197
3.27 确保对象撤销 201
3.28 通过托管代码释放COM对象 203
3.29 创建对象缓存 204
3.30 回滚对象修改 213
3.31 非托管资源的撤销 221
3.32 确定装箱和拆箱发生在何处 228
第4章 泛型 231
4.0 引言 231
4.1 决定何时及何处使用泛型 231
4.2 了解泛型类型 232
4.3 得到泛型类型的类型 240
4.4 将ArrayList替换为其相应的泛型类型 241
4.5 将Stack和Queue替换为相应的泛型类型 245
4.6 实现一个链表 250
4.7 创建可以初始化为Null的值类型 253
4.8 逆转有序表的内容 255
4.9 建立泛型只读集合 283
4.10 将Hashtable替换为其相应的泛型类型 284
4.11 对泛型Dictionary类型使用foreach 288
4.12 约束类型参数 289
4.13 将泛型变量初始化为其默认值 292
第5章 集合 294
5.0 引言 294
5.1 交换数组中的两个元素 296
5.2 快速逆置数组 297
5.3 逆置二维数组 300
5.4 逆置多重数组 302
5.5 编写一个更灵活的StackTrace类 304
5.6 确定一项出现在List〈T〉中的次数 309
5.7 获取一个特定项在List〈T〉中的所有实例 312
5.8 从数组插入和删除项 316
5.9 保持List〈T〉有序 318
5.10 对字典的键和/或值排序 321
5.11 创建一个有最大值和最小值边界的字典 324
5.12 将数组数据显示为定界串 327
5.13 在数组中存储列表的快照 328
5.14 在应用会话之间持久存储集合 329
5.15 测试Array或List〈T〉中的每一个元素 331
5.16 在Array或List〈T〉中的每个元素上执行一个动作 333
5.17 创建一个只读Array或List〈T〉 335
第6章 迭代器和部分类型 338
6.0 引言 338
6.1 在类中实现嵌套foreach功能 339
6.2 创建定制枚举器 344
6.3 在泛型类型上创建一个迭代器 348
6.4 在非泛型类型上创建一个迭代器 350
6.5 创建接受参数的迭代器 352
6.6 在一个类型上增加多个迭代器 354
6.7 将迭代器实现为重载操作符 358
6.8 迫使迭代器停止迭代 365
6.9 处理Finally块和迭代器 366
6.10 组织接口实现 370
6.11 生成不再在主代码路径中的代码 375
第7章 异常处理 378
7.0 引言 378
7.1 验证关键参数 385
7.2 了解何时捕获和重新抛出异常 387
7.3 明确异常及其用法 388
7.4 单独地处理派生异常 392
7.5 使用Finally块时确保异常不丢失 395
7.6 处理通过反射调用的方法所抛出的异常 398
7.7 调试加载程序集时的问题 401
7.8 托管异常和HRESULT之间的映射 402
7.9 处理用户自定义的HRESULT 407
7.10 避免未处理的异常 408
7.11 获得异常信息 410
7.12 快速找出问题根源 414
7.13 创建一个新的异常类型 415
7.14 得到栈轨迹 428
7.15 异常初次出现时中断 430
7.16 避免恶毒的TypeInitializationException 433
7.17 处理从异步委托抛出的异常 437
7.18 通过Exception.Data为异常提供所需的额外信息 438
7.19 使用可视化工具以一种新方式查看异常 440
7.20 在WinForms应用中处理未处理的异常 448
第8章 诊断 451
8.0 引言 451
8.1 在生产代码中控制跟踪输出 451
8.2 对调试/跟踪输出提供细粒度控制 455
8.3 创建你自己的定制开关类 458
8.4 有条件地编译代码块 463
8.5 确定一个进程是否停止响应 465
8.6 在应用中使用事件日志 467
8.7 改变一个定制事件日志的最大大小 474
8.8 搜索事件日志条目 476
8.9 监视事件日志中的特定条目 479
8.10 查找一个特定事件日志的所有源 481
8.11 实现一个简单的性能计数器 483
8.12 实现需要基计数器的性能计数器 487
8.13 启用和禁用复杂的跟踪代码 490
8.14 捕获进程的标准输出 493
8.15 为类创建定制调试显示 496
8.16 确定当前AppDomain设置信息 498
8.17 通过编程提高进程的优先级 500
8.18 查看运行时环境,确定能做何处理 502
第9章 委托、事件和匿名方法 504
9.0 引言 504
9.1 控制组播委托中是否触发和何时触发一个委托 505
9.2 从组播委托中的各个委托得到返回值 508
9.3 单独地处理组播委托中各委托的异常 510
9.4 将同步委托调用转换为异步委托调用 514
9.5 包装密封类来增加事件 517
9.6 向事件来回传递特殊化参数 524
9.7 一种高级接口搜索机制 529
9.8 一个高级成员搜索机制 533
9.9 观察对一个Hashtable的增加和修改 538
9.10 使用Windows键盘钩 546
9.11 跟踪和响应鼠标 553
9.12 使用匿名方法 554
9.13 简洁地建立事件处理器 558
9.14 在匿名方法中使用不同参数修饰符 562
9.15 使用C#中的闭包 566
9.16 使用算子在一个列表上执行多个操作 570
第10章 正则表达式 574
10.0 引言 574
10.1 枚举列出匹配 575
10.2 从MatchCollection抽取组 578
10.3 验证正则表达式的语法 581
10.4 快速地找出串中最后一个匹配 583
10.5 替换串中的字符或单词 584
10.6 增强基本的串替换功能 587
10.7 实现一个更好的词法分析器 590
10.8 编译正则表达式 592
10.9 统计文本行 594
10.10 返回找到匹配的整行 597
10.11 找到一个匹配的特定出现 601
10.12 使用公共模式 603
10.13 为正则表达式增加文档注释 606
10.14 使用内置正则表达式解析ASP.NET页面 607
第11章 数据结构和算法 614
11.0 引言 614
11.1 为一个数据类型创建散列码 614
11.2 创建优先队列 622
11.3 创建双向队列 631
11.4 确定字符或串在哪里不平衡 638
11.5 创建一对多映射(MultiMap) 643
11.6 创建二叉树 652
11.7 创建n叉树 666
11.8 创建一个Set对象 679
第12章 文件系统I/O 693
12.0 引言 693
12.1 创建、复制、移动或删除文件 694
12.2 管理文件属性 697
12.3 重命名文件 700
12.4 确定一个文件是否存在 701
12.5 选择一个打开文件或流的方法来完成读和/或写 701
12.6 随机地访问部分文件 709
12.7 输出一个平台独立的EOL字符 713
12.8 创建和读写文件 715
12.9 确定一个目录是否存在 723
12.10 创建、移动或删除一个目录 723
12.11 管理目录属性 725
12.12 重命名目录 728
12.13 使用通配符搜索目录或文件 730
12.14 得到目录树 734
12.15 解析路径 736
12.16 解析环境变量中的路径 738
12.17 验证路径 739
12.18 在应用中使用临时文件 744
12.19 只用文件句柄打开文件流 745
12.20 一次写多个输出文件 747
12.21 启动控制台工具并与之交互 750
12.22 锁定文件中的部分 752
12.23 监视文件系统中对一个或多个或目录的特定修改 755
12.24 等待文件系统中发生某个动作 761
12.25 比较两个可执行模块的版本信息 763
12.26 查询一个系统上所有驱动器的信息 767
12.27 加密/解密一个现有的文件 769
12.28 压缩和解压文件 770
第13章 反射 774
13.0 引言 774
13.1 列出所引用的程序集 774
13.2 列出导出的类型 777
13.3 查找被覆盖的方法 778
13.4 查找一个程序集中的成员 783
13.5 查找一个接口中的成员 785
13.6 确定和得到一个程序集中的嵌套类型 786
13.7 显示一个类型的继承层次体系 788
13.8 查找一个类型的子类 790
13.9 查找一个程序集中的所有可串行化类型 792
13.10 得到成员时过滤输出 794
13.11 动态地调用成员 798
13.12 为模糊器提供指导 802
13.13 确定一个类型或方法是否为泛型 804
13.14 通过编程读取清单资源 806
13.15 访问局部变量信息 807
13.16 创建泛型类型 809
第14章 Web 812
14.0 引言 812
14.1 将IP地址转换为主机名 812
14.2 将主机名转换为IP地址 813
14.3 解析URI 814
14.4 构成和验证绝对URI 818
14.5 处理Web服务器错误 820
14.6 与Web服务器通信 823
14.7 通过代理 825
14.8 从URL得到HTML 826
14.9 使用新的Web浏览器控件 827
14.10 缓存数据库表 830
14.11 缓存有多个依赖关系的数据 832
14.12 通过编程预构建一个ASP.NET Web网站 834
14.13 Web转义数据和取消转义 837
14.14 使用UriBuilder类 839
14.15 检查和修改Web应用配置 841
14.16 处理HTML 844
14.17 处理HTTP时使用缓存结果来得到更高的性能 846
14.18 检查一个Web服务器的定制错误页面 848
14.19 确定IIS上ASP.NET的应用映射 851
第15章 XML 854
15.0 引言 854
15.1 按文档顺序读取和访问XML数据 854
15.2 读取Web上的XML 858
15.3 查询一个XML文档的内容 860
15.4 验证XML 862
15.5 通过编程创建XML文档 867
15.6 检测对XML文档的修改 870
15.7 处理XML串中的非法字符 873
15.8 转换XML 875
15.9 分解XML文档 880
15.10 整理XML文档 884
15.11 验证有修改的XML文档而无需重加载 889
15.12 扩展XSLT转换 892
15.13 从现有的XML文件批量地得到模式 895
15.14 向XSLT转换传递参数 897
第16章 网络 901
16.0 引言 901
16.1 编写TCP服务器 901
16.2 编写TCP客户 907
16.3 模拟表单执行 910
16.4 从服务器下载数据 914
16.5 使用命名管道来通信 916
16.6 通过编程完成ping操作 937
16.7 使用SMTP服务发送SMTP邮件 939
16.8 检查网络互连性 944
16.9 使用Socket扫描机器上的端口 949
16.10 使用当前Internet连接设置 954
16.11 使用FTP下载文件 961
第17章 安全 963
17.0 引言 963
17.1 控制对本地程序集中类型的访问 963
17.2 加密/解密串 973
17.3 加密和解密文件 977
17.4 清除加密信息 982
17.5 验证串在传输过程中未遭到破坏 984
17.6 包装串的散列以便于使用 987
17.7 一个更好的随机数生成器 993
17.8 安全地存储数据 994
17.9 使安全断言安全 1001
17.10 防止对程序集的恶意修改 1003
17.11 验证程序集已经被授予特定权限 1006
17.12 尽量减小程序集的攻击面 1007
17.13 获得安全/审计信息 1008
17.14 授予/撤销对文件或注册表键的访问权限 1014
17.15 用安全串保护串数据 1017
17.16 保护流数据 1019
17.17 加密web.config信息 1028
17.18 得到抛出一个SecurityException的完整原因 1030
17.19 得到安全的Unicode编码 1033
17.20 得到一个更安全的文件句柄 1034
第18章 线程与同步 1036
18.0 引言 1036
18.1 创建针对单个线程的静态字段 1036
18.2 对类成员提供线程安全的访问 1039
18.3 防止线程悄无声息地终止 1045
18.4 轮询异步委托 1047
18.5 让异步委托超时 1050
18.6 得到异步委托完成的通知 1052
18.7 确定线程池请求是否排队 1055
18.8 配置定时器 1057
18.9 秘密地存储特定于线程的数据 1060
18.10 用信号量允许多个客户访问资源 1064
18.11 用Mutex同步多个进程 1068
18.12 使用事件来实现线程协作 1079
18.13 得到事件的命名权限 1081
18.14 线程间执行原子操作 1085
第19章 不安全的代码 1087
19.0 引言 1087
19.1 控制对传递给方法的指针的修改 1088
19.2 比较指针 1091
19.3 遍历数组 1093
19.4 管理指向固定数组的指针 1095
19.5 返回数组中一个特殊元素的指针 1096
19.6 创建并使用指针数组 1098
19.7 切换未知指针类型 1099
19.8 将串转换为char* 1102
19.9 声明有内嵌数组的固定大小的结构 1103
第20章 工具箱 1105
20.0 引言 1105
20.1 处理操作系统停止、电源管理或用户会话修改 1105
20.2 控制服务 1110
20.3 列出加载给定程序集的进程 1114
20.4 在本地工作站上使用消息队列 1115
20.5 查找当前Framework版本的路径 1118
20.6 确定全局程序集缓存(GAC)中所注册程序集的版本 1119
20.7 得到Windows目录 1122
20.8 捕获标准输出流的输出 1123
20.9 代码在其自己的应用域中运行 1125
20.10 确定操作系统和当前操作系统的SP版本 1127