C#经典实例(第二版)
C#经典实例(第二版)
Jay Hilyard, Stephen Teilhet
苏金国, 王宇飞 译
出版时间:2007年05月
页数:1128
本书是畅销书《C#经典实例》的最新版,针对C# 2.0和.NET 2.0做了全面修订。对于C#程序员经常遇到的300多个最常见和不那么常见的任务,本书涵盖了解决这些问题所需的全部技巧。从使用正则表达式到处理泛型类型,再到如何让代码在其自己的应用域中运行,通过本书的介绍,你会更深入地了解C#语言,在基于.NET 2.0的Windows应用和ASP.NET Web应用新领域中更加游刃有余。
第二版的主要特点包括:
● 编写了新的章节来讨论泛型、迭代器、部分类型以及Web,并补充了90多个新技巧,包括“使用匿名方法”、“迭代器实现为重载操作符”和“加密web.config信息”等等。
● 提供了反映C# 2.0和.NET 2.0变化的一些新技巧,如“将Stack和Queue替换为相应的泛型类型”和“控制服务”。
● 为每个解决方案提供了可下载的代码,包括完备的测试用例,以便编译和测试这些示例,还可以复制粘贴对你有用的代码行,来创建你自己的解决方案。
本书共20章,主要包括以下内容:
● 泛型类型、集合和迭代器
● 异常处理和诊断、事件、委托以及匿名方法
● 数值、枚举、类、结构和部分类
● 串、正则表达式和XML
与O誖eilly Cookbook系列的其他书一样,这里的每个技巧都做了精心组织,以便你快速了解问题,学会如何加以解决,并了解到可能存在的问题或限制。对于刚接触 C#的程序员来说,本书绝对是你起步并不断提高技艺的得力工具。如果你已经是一个有经验的程序员,会发现利用本书能很方便地查看语法和常见用例;随着企业的发展,你还会遇到更棘手的问题,本书将是解决这些问题的一个绝好资源。不论是谁,可能只需这里的一个技巧就能让你轻松地脱身,而不必整日整夜地呆在计算机旁苦思冥想。
Jay Hilyard是 Newmarket International(位于Portsmouth, NH)新产品开发小组(New Product Development)的成员。Stephen Teilhet是位于Nashua, NH的Compuware Numega Labs的一名开发人员,在这里他参与过多项获奖产品的开发,包括DevPartner CodeReview和最近的DevPartner SecurityChecker。
  1. 前言
  2. 第1章 数字与枚举
  3. 1.0 引言
  4. 1.1 确定分数与浮点数值之间的近似相等性
  5. 1.2 度转换为弧度
  6. 1.3 弧度转换为度
  7. 1.4 对各种数据类型使用反码操作符
  8. 1.5 测试奇偶值
  9. 1.6 得到一个数的高字或低字
  10. 1.7 将其他进制的数转换为十进制数
  11. 1.8 确定一个串是否是一个合法数字
  12. 1.9 浮点数值取整
  13. 1.10 选择取整算法
  14. 1.11 摄氏温度转换为华氏温度
  15. 1.12 华氏温度转换为摄氏温度
  16. 1.13 安全地执行窄化数值强制转换
  17. 1.14 得出直角三角形任意三边的边长
  18. 1.15 得出直角三角形的角度
  19. 1.16 将枚举值显示为一个串
  20. 1.17 将纯文本转换为一个等价的枚举值
  21. 1.18 测试一个合法的枚举值
  22. 1.19 测试是否为合法的标志枚举
  23. 1.20 在位掩码中使用枚举成员
  24. 1.21 确定是否设置了一个或多个枚举标志
  25. 1.23 确定一个Decimal或Double的整数部分
  26. 第2章 串和字符
  27. 2.0 引言
  28. 2.1 确定一个char包含何种字符
  29. 2.2 确定一个字符是否在指定范围内
  30. 2.3 比较两个字符时控制大小写敏感性
  31. 2.4 找出字符在串中的所有出现
  32. 2.5 找出一个串在另一个串中的所有出现的位置
  33. 2.6 实现一个简单的词法分析器解构一个串
  34. 2.7 比较两个串时控制大小写敏感性
  35. 2.8 将一个串与第二个串的开头或结尾进行比较
  36. 2.9 在串中插入文本
  37. 2.10 删除或替换串中的字符
  38. 2.11 将二进制数据编码为Base64
  39. 2.12 对Base64编码的二进制数据解码
  40. 2.13 将作为Byte[ ]返回的一个串转换回String
  41. 2.14 将一个String传递给只接受byte[ ]的方法
  42. 2.15 将串转换为其他类型
  43. 2.16 格式化串中的数据
  44. 2.17 创建一个定界串
  45. 2.18 从定界串抽取项
  46. 2.19 设置StringBuilder所能包含的最大字符数
  47. 2.20 迭代处理串中的各个字符
  48. 2.21 改善串比较性能
  49. 2.22 改善StringBuilder的性能
  50. 2.23 去掉串开头和/或结尾的字符
  51. 2.24 测试一个串是否为Null或空串
  52. 2.25 追加一行
  53. 2.26 大块数据的编码
  54. 第3章 类和结构
  55. 3.0 引言
  56. 3.1 创建联合类型的结构
  57. 3.2 允许一个类型将自身表示为String
  58. 3.3 将一个对象的串表示转换为实际对象
  59. 3.4 利用抽象基类实现多态
  60. 3.5 使类型可排序
  61. 3.6 使类型可搜索
  62. 3.7 间接重载+=、- =、/=和*=操作符
  63. 3.8 间接重载&&、||和?: 操作符
  64. 3.9 打开或关闭位
  65. 3.10 建立无错表达式
  66. 3.11 最小化(减少)布尔逻辑
  67. 3.12 以独立于语言的方式实现简单类型间的转换
  68. 3.13 确定何时使用强制转换操作符、as操作符或is操作符
  69. 3.14 用as操作符强制转换
  70. 3.15 用is操作符确定一个变量的类型
  71. 3.16 用接口实现多态
  72. 3.17 在多个对象类型上调用相同的方法
  73. 3.18 使用接口增加通知回调
  74. 3.19 使用多个入口点实现应用版本化
  75. 3.20 避免创建仅部分初始化的对象
  76. 3.21 从一个方法返回多项
  77. 3.22 解析命令行参数
  78. 3.23 改进类以与COM互操作
  79. 3.24 在运行时初始化一个常量字段
  80. 3.25 编写与所有托管语言兼容的代码
  81. 3.26 构建可复制类
  82. 3.27 确保对象撤销
  83. 3.28 通过托管代码释放COM对象
  84. 3.29 创建对象缓存
  85. 3.30 回滚对象修改
  86. 3.31 非托管资源的撤销
  87. 3.32 确定装箱和拆箱发生在何处
  88. 第4章 泛型
  89. 4.0 引言
  90. 4.1 决定何时及何处使用泛型
  91. 4.2 了解泛型类型
  92. 4.3 得到泛型类型的类型
  93. 4.4 将ArrayList替换为其相应的泛型类型
  94. 4.5 将Stack和Queue替换为相应的泛型类型
  95. 4.6 实现一个链表
  96. 4.7 创建可以初始化为Null的值类型
  97. 4.8 逆转有序表的内容
  98. 4.9 建立泛型只读集合
  99. 4.10 将Hashtable替换为其相应的泛型类型
  100. 4.11 对泛型Dictionary类型使用foreach
  101. 4.12 约束类型参数
  102. 4.13 将泛型变量初始化为其默认值
  103. 第5章 集合
  104. 5.0 引言
  105. 5.1 交换数组中的两个元素
  106. 5.2 快速逆置数组
  107. 5.3 逆置二维数组
  108. 5.4 逆置多重数组
  109. 5.5 编写一个更灵活的StackTrace类
  110. 5.6 确定一项出现在List<T>中的次数
  111. 5.7 获取一个特定项在List<T>中的所有实例
  112. 5.8 从数组插入和删除项
  113. 5.9 保持List<T>有序
  114. 5.10 对字典的键和/或值排序
  115. 5.11 创建一个有最大值和最小值边界的字典
  116. 5.12 将数组数据显示为定界串
  117. 5.13 在数组中存储列表的快照
  118. 5.14 在应用会话之间持久存储集合
  119. 5.15 测试Array或List<T>中的每一个元素
  120. 5.16 在Array 或List<T>中的每个元素上执行一个动作
  121. 5.17 创建一个只读Array或List<T>
  122. 第6章 迭代器和部分类型
  123. 6.0 引言
  124. 6.1 在类中实现嵌套foreach功能
  125. 6.2 创建定制枚举器
  126. 6.3 在泛型类型上创建一个迭代器
  127. 6.4 在非泛型类型上创建一个迭代器
  128. 6.5 创建接受参数的迭代器
  129. 6.6 在一个类型上增加多个迭代器
  130. 6.7 将迭代器实现为重载操作符
  131. 6.8 迫使迭代器停止迭代
  132. 6.9 处理Finally块和迭代器
  133. 6.10 组织接口实现
  134. 6.11 生成不再在主代码路径中的代码
  135. 第7章 异常处理
  136. 7.0 引言
  137. 7.1 验证关键参数
  138. 7.2 了解何时捕获和重新抛出异常
  139. 7.3 明确异常及其用法
  140. 7.4 单独地处理派生异常
  141. 7.5 使用Finally块时确保异常不丢失
  142. 7.6 处理通过反射调用的方法所抛出的异常
  143. 7.7 调试加载程序集时的问题
  144. 7.8 托管异常和HRESULT之间的映射
  145. 7.9 处理用户自定义的HRESULT
  146. 7.10 避免未处理的异常
  147. 7.11 获得异常信息
  148. 7.12 快速找出问题根源
  149. 7.13 创建一个新的异常类型
  150. 7.14 得到栈轨迹
  151. 7.15 异常初次出现时中断
  152. 7.16 避免恶毒的TypeInitializationException
  153. 7.17 处理从异步委托抛出的异常
  154. 7.18 通过Exception.Data为异常提供所需的额外信息
  155. 7.19 使用可视化工具以一种新方式查看异常
  156. 7.20 在WinForms应用中处理未处理的异常
  157. 第8章 诊断
  158. 8.0 引言
  159. 8.1 在生产代码中控制跟踪输出
  160. 8.2 对调试/跟踪输出提供细粒度控制
  161. 8.3 创建你自己的定制开关类
  162. 8.4 有条件地编译代码块
  163. 8.5 确定一个进程是否停止响应
  164. 8.6 在应用中使用事件日志
  165. 8.7 改变一个定制事件日志的最大大小
  166. 8.8 搜索事件日志条目
  167. 8.9 监视事件日志中的特定条目
  168. 8.10 查找一个特定事件日志的所有源
  169. 8.11 实现一个简单的性能计数器
  170. 8.12 实现需要基计数器的性能计数器
  171. 8.13 启用和禁用复杂的跟踪代码
  172. 8.14 捕获进程的标准输出
  173. 8.15 为类创建定制调试显示
  174. 8.16 确定当前AppDomain设置信息
  175. 8.17 通过编程提高进程的优先级
  176. 8.18 查看运行时环境,确定能做何处理
  177. 第9章 委托、事件和匿名方法
  178. 9.0 引言
  179. 9.1 控制组播委托中是否触发和何时触发一个委托
  180. 9.2 从组播委托中的各个委托得到返回值
  181. 9.3 单独地处理组播委托中各委托的异常
  182. 9.4 将同步委托调用转换为异步委托调用
  183. 9.5 包装密封类来增加事件
  184. 9.6 向事件来回传递特殊化参数
  185. 9.7 一种高级接口搜索机制
  186. 9.8 一个高级成员搜索机制
  187. 9.9 观察对一个Hashtable的增加和修改
  188. 9.10 使用Windows键盘钩
  189. 9.11 跟踪和响应鼠标
  190. 9.12 使用匿名方法
  191. 9.13 简洁地建立事件处理器
  192. 9.14 在匿名方法中使用不同参数修饰符
  193. 9.15 使用C#中的闭包
  194. 9.16 使用算子在一个列表上执行多个操作
  195. 第10章 正则表达式
  196. 10.0 引言
  197. 10.1 枚举列出匹配
  198. 10.2 从MatchCollection抽取组
  199. 10.3 验证正则表达式的语法
  200. 10.4 快速地找出串中最后一个匹配
  201. 10.5 替换串中的字符或单词
  202. 10.6 增强基本的串替换功能
  203. 10.7 实现一个更好的词法分析器
  204. 10.8 编译正则表达式
  205. 10.9 统计文本行
  206. 10.10 返回找到匹配的整行
  207. 10.11 找到一个匹配的特定出现
  208. 10.12 使用公共模式
  209. 10.13 为正则表达式增加文档注释
  210. 10.14 使用内置正则表达式解析ASP.NET页面
  211. 第11章 数据结构和算法
  212. 11.0 引言
  213. 11.1 为一个数据类型创建散列码
  214. 11.2 创建优先队列
  215. 11.3 创建双向队列
  216. 11.4 确定字符或串在哪里不平衡
  217. 11.5 创建一对多映射(MultiMap)
  218. 11.6 创建二叉树
  219. 11.7 创建n叉树
  220. 11.8 创建一个Set对象
  221. 第12章 文件系统I/O
  222. 12.0 引言
  223. 12.1 创建、复制、移动或删除文件
  224. 12.2 管理文件属性
  225. 12.3 重命名文件
  226. 12.4 确定一个文件是否存在
  227. 12.5 选择一个打开文件或流的方法来完成读和/或写
  228. 12.6 随机地访问部分文件
  229. 12.7 输出一个平台独立的EOL字符
  230. 12.8 创建和读写文件
  231. 12.9 确定一个目录是否存在
  232. 12.10 创建、移动或删除一个目录
  233. 12.11 管理目录属性
  234. 12.12 重命名目录
  235. 12.13 使用通配符搜索目录或文件
  236. 12.14 得到目录树
  237. 12.15 解析路径
  238. 12.16 解析环境变量中的路径
  239. 12.17 验证路径
  240. 12.18 在应用中使用临时文件
  241. 12.19 只用文件句柄打开文件流
  242. 12.20 一次写多个输出文件
  243. 12.21 启动控制台工具并与之交互
  244. 12.22 锁定文件中的部分
  245. 12.23 监视文件系统中对一个或多个或目录的特定修改
  246. 12.24 等待文件系统中发生某个动作
  247. 12.25 比较两个可执行模块的版本信息
  248. 12.26 查询一个系统上所有驱动器的信息
  249. 12.27 加密/解密一个现有的文件
  250. 12.28 压缩和解压文件
  251. 第13章 反射
  252. 13.0 引言
  253. 13.1 列出所引用的程序集
  254. 13.2 列出导出的类型
  255. 13.3 查找被覆盖的方法
  256. 13.4 查找一个程序集中的成员
  257. 13.5 查找一个接口中的成员
  258. 13.6 确定和得到一个程序集中的嵌套类型
  259. 13.7 显示一个类型的继承层次体系
  260. 13.8 查找一个类型的子类
  261. 13.9 查找一个程序集中的所有可串行化类型
  262. 13.10 得到成员时过滤输出
  263. 13.11 动态地调用成员
  264. 13.12 为模糊器提供指导
  265. 13.13 确定一个类型或方法是否为泛型
  266. 13.14 通过编程读取清单资源
  267. 13.15 访问局部变量信息
  268. 13.16 创建泛型类型
  269. 第14章 Web
  270. 14.0 引言
  271. 14.1 将IP地址转换为主机名
  272. 14.2 将主机名转换为IP地址
  273. 14.3 解析URI
  274. 14.4 构成和验证绝对URI
  275. 14.5 处理Web服务器错误
  276. 14.6 与Web服务器通信
  277. 14.7 通过代理
  278. 14.8 从URL得到HTML
  279. 14.9 使用新的Web浏览器控件
  280. 14.10 缓存数据库表
  281. 14.11 缓存有多个依赖关系的数据
  282. 14.12 通过编程预构建一个ASP.NET Web网站
  283. 14.13 Web转义数据和取消转义
  284. 14.14 使用UriBuilder类
  285. 14.15 检查和修改Web应用配置
  286. 14.16 处理HTML
  287. 14.17 处理HTTP时使用缓存结果来得到更高的性能
  288. 14.18 检查一个Web服务器的定制错误页面
  289. 14.19 确定IIS上ASP.NET的应用映射
  290. 第15章 XML
  291. 15.0 引言
  292. 15.1 按文档顺序读取和访问XML数据
  293. 15.2 读取Web上的XML
  294. 15.3 查询一个XML文档的内容
  295. 15.4 验证XML
  296. 15.5 通过编程创建XML文档
  297. 15.6 检测对XML文档的修改
  298. 15.7 处理XML串中的非法字符
  299. 15.8 转换XML
  300. 15.9 分解XML文档
  301. 15.10 整理XML文档
  302. 15.11 验证有修改的XML文档而无需重加载
  303. 15.12 扩展XSLT转换
  304. 15.13 从现有的XML文件批量地得到模式
  305. 15.14 向XSLT转换传递参数
  306. 第16章 网络
  307. 16.0 引言
  308. 16.1 编写TCP服务器
  309. 16.2 编写TCP客户
  310. 16.3 模拟表单执行
  311. 16.4 从服务器下载数据
  312. 16.5 使用命名管道来通信
  313. 16.6 通过编程完成ping操作
  314. 16.7 使用SMTP服务发送SMTP邮件
  315. 16.8 检查网络互连性
  316. 16.9 使用Socket扫描机器上的端口
  317. 16.10 使用当前Internet连接设置
  318. 16.11 使用FTP下载文件
  319. 第17章 安全
  320. 17.0 引言
  321. 17.1 控制对本地程序集中类型的访问
  322. 17.2 加密/解密串
  323. 17.3 加密和解密文件
  324. 17.4 清除加密信息
  325. 17.5 验证串在传输过程中未遭到破坏
  326. 17.6 包装串的散列以便于使用
  327. 17.7 一个更好的随机数生成器
  328. 17.8 安全地存储数据
  329. 17.9 使安全断言安全
  330. 17.10 防止对程序集的恶意修改
  331. 17.11 验证程序集已经被授予特定权限
  332. 17.12 尽量减小程序集的攻击面
  333. 17.13 获得安全/审计信息
  334. 17.14 授予/撤销对文件或注册表键的访问权限
  335. 17.15 用安全串保护串数据
  336. 17.16 保护流数据
  337. 17.17 加密web.config信息
  338. 17.18 得到抛出一个SecurityException的完整原因
  339. 17.19 得到安全的Unicode编码
  340. 17.20 得到一个更安全的文件句柄
  341. 第18章 线程与同步
  342. 18.0 引言
  343. 18.1 创建针对单个线程的静态字段
  344. 18.2 对类成员提供线程安全的访问
  345. 18.3 防止线程悄无声息地终止
  346. 18.4 轮询异步委托
  347. 18.5 让异步委托超时
  348. 18.6 得到异步委托完成的通知
  349. 18.7 确定线程池请求是否排队
  350. 18.8 配置定时器
  351. 18.9 秘密地存储特定于线程的数据
  352. 18.10 用信号量允许多个客户访问资源
  353. 18.11 用Mutex同步多个进程
  354. 18.12 使用事件来实现线程协作
  355. 18.13 得到事件的命名权限
  356. 18.14 线程间执行原子操作
  357. 第19章 不安全的代码
  358. 19.0 引言
  359. 19.1 控制对传递给方法的指针的修改
  360. 19.2 比较指针
  361. 19.3 遍历数组
  362. 19.4 管理指向固定数组的指针
  363. 19.5 返回数组中一个特殊元素的指针
  364. 19.6 创建并使用指针数组
  365. 19.7 切换未知指针类型
  366. 19.8 将串转换为char*
  367. 19.9 声明有内嵌数组的固定大小的结构
  368. 第20章 工具箱
  369. 20.0 引言
  370. 20.1 处理操作系统停止、电源管理或用户会话修改
  371. 20.2 控制服务
  372. 20.3 列出加载给定程序集的进程
  373. 20.4 在本地工作站上使用消息队列 
  374. 20.5 查找当前Framework版本的路径
  375. 20.6 确定全局程序集缓存(GAC)中所注册程序集的版本
  376. 20.7 得到Windows目录
  377. 20.8 捕获标准输出流的输出
  378. 20.9 代码在其自己的应用域中运行
  379. 20.10确定操作系统和当前操作系统的SP版本
书名:C#经典实例(第二版)
译者:苏金国, 王宇飞 译
国内出版社:中国电力出版社
出版时间:2007年05月
页数:1128
书号:978-7-5083-5152-0
原版书出版商:O'Reilly Media
Jay Hilyard
 
Jay Hilyard已经有12年多开发Windows应用的经验,开发.NET应用也有4年多了。Jay在《MSDN Magazine》上发表过多篇文章,目前在Newmarket International(位于Portsmouth, NH)的新产品开发小组(New Product Development)工作。他主要致力于.NET的研究,除此之外,Jay会与他的家人共享闲暇时光,再就是研究家谱。
Jay Hilyard开发Windows应用程序的时间超过了15年,其中有7年多的时间在开发.NET应用程序。他在MSDN Magazine中发表了众多文章,他目前在位于美国新罕布什尔州朴次茅斯市的Newmarket International的New Product团队工作。
 
 
Stephen Teilhet
 
Stephen Teilhet获得过电子工程专业的学位,但是很快就开始编写Windows平台的软件。在过去的11年里,他曾为多家咨询公司效力,参加过大量项目,从事过Visual Basic、Visual C++、MTS、COM、MSMQ和SQL Server的工作。目前Stephen在Nashua, NH的Compuware Numega Labs任职,在这里他参与过多项获奖产品的开发,包括DevPartner CodeReview和最近的DevPartner SecurityChecker。
Stephen Teilhet自从Microsoft开发了.NET 1.0 Framework预发行版本以来,就一直在使用.NET平台。目前,他为Ounce Labs工作,增强它们的静态安全代码分析工具,用以找出多种语言(包括C#和Visual Basic)中的漏洞。
 
 
本书封面上是一条吊带蛇(灌木蛇)。之所以得名,是因为它们长长的斑纹就好像是用来吊丝袜的吊带。从吊带蛇特有的条纹上很容易把它分辨出来:在背中央有一条窄条纹,两侧又各有一条较粗的条纹。条纹的颜色和样式可能会变化,使它们能很好地溶入所在的环境,帮助它们躲避天敌。这是北美最常见的一种蛇,也是阿拉斯加仅存的蛇类。
吊带蛇身上有刻度,在刻度中轴上有一个或多个叉,给它们一种粗糙暗淡的质感。成年吊带蛇身长通常为46~130厘米之间(大约一英尺半到四英尺多)。雌蛇通常比雄蛇大,但尾巴较短,而且身体和尾巴相连处有一个包。
雌吊带蛇是卵胎生的,这说明,小蛇会从软蛋里出生。出生后,大多数蛋和膜都已经破了,所以它们会直接降生。不过有时蛇宝宝出生时还在软壳里。雌蛇通常会生10~40个宝宝:吊带蛇生宝宝的最高记录是98个。从母体诞生后,小蛇就完全独立,必须自己“养活”自己。在这个阶段,它们很可能会被吃掉,一半以上的小蛇在1岁前都会死掉。
吊带蛇是少数能吃蟾蜍、蝾螈和其他有很强化学防卫能力的两栖动物的动物之一。尽管它们的食谱随环境会有变化,但吊带蛇大多都吃蚯蚓和两栖动物;不过,有时它们也吃小鸟、鱼和小老鼠。吊带蛇有毒液,但对人无害,它们用这些毒液把猎物弄昏或杀死,然后整个吞下。