更锋利的C#代码:编写高质量C#程序

版权信息书 名: 更锋利的C#代码:编写高质量C#程序
作者:包善东
出版社:清华大学出版社
出版时间: 2008
ISBN: 9787302179429
开本: 16
定价: 49.00 元
内容简介一个好的程序,不仅仅是能得出正确的运行结果,而且还应在其内部保持清晰的代码逻辑和语义,否则,跟随在正常结果之后的也许是艰难的代码维护工作,对程序进行一处修改往往会牵一发而动全身,一不小心就会埋下深深的陷患。从另一个角度来说,如果每一行代码的质量都很高,那么这个软件产品也一定是高质量的。这就像ISO9000的质量体系认证一样,与其在产品生产完成之后再进行检验,不如控制每一步生产环节的质量。
《更锋利的C#代码》由浅入深、由表及里地讲述存在于C#编码开发中的各种质量问题,让读者清楚地了解什么是应该做的,什么是不应该做的。C#提供的每种语言机制的功能背后,体现了怎样的逻辑含义。当遇到具体的问题时,应该如何选择与取舍。阅读完此书的每一个章节,都会让读者站在更高的角度C#体系拥有更深的认识和把握,不断向软件开发的更高层次迈进。
在线视听
作者简介包善东(网名RichardBao)作者是群硕软件开发有限公司的一名交互设计师和软件工程师。9岁时萌生了对编程的浓厚兴趣,从此走上了软件开发的道路,至今已积累了十多年的编程经验。作者还曾是其学校交响乐团的大提琴兼钢琴演奏员,在英、法、德、港、台及内地多次进行演出。也许是音乐与艺术思想对编程的渗透,使其在编程中往往善于寻找和谐之美,避免一切生搬硬套。这也许才是《更锋利的C#代码》思想的根源吧。
编辑推荐一个好的程序,不仅仅是能得出正确的运行结果。每个章节的内容似乎都为大家所熟悉,然而视角完全不同。通过对那些几乎被人们忽视了的细节的精心处理,不断地提高每一行代码的质量。它们为什么必须是,而并非形式主义。C#提供的每种语言机制的功能背后,体现了怎样的逻辑含义。读完此书,你会站在更高的角度与C#体系拥有更深的认识和把握。
谁能够让自己像浑浊的大水一样安静下来,慢慢得到澄清?
——《老子》
又有谁能够从安静中开始变化,渐渐焕发出生机?
目录第1章基本的代码风格
1.1换行的讲究
1.1.1寻找最佳的断行位置
1.1.2每行只写一条语句
1.1.3分行定义变量
1.2避免代码过于拥挤
1.2.1使用空行分隔代码块
1.2.2使用空格降低代码密度
1.3如何缩进
1.3.1嵌套或包含关系引起的缩进
1.3.2因换行而产生的缩进
1.3.3使用空格还是Tab键
1.4大括号
1.4.1大括号的位置
1.4.2空的大括号结构
1.4.3仅包含单个语句的结构体
1.5保持项目文件的条理性
1.5.1解决方案的结构呼应
1.5.2代码文件的结构
1.5.3使用#region标记来隐藏细节
第2章养成良好的注释习惯
2.1何时需要注释
2.1.1解释代码的意图
2.1.2对局部变量的说明
2.1.3充当代码标题
2.1.4指出例外情况
2.1.5开发过程的提示
2.2注释的格式
2.2.1单行注释
2.2.2多行注释
2.3正确使用XML文档注释
2.3.1结构与类的XML文档注释
2.3.2属性的XML文档注释
2.3.3方法的XML文档注释
2.3.4构造函数的XML文档注释
2.3.5事件的XML文档注释
2.3.6枚举类型的XML文档注释
2.3.7泛型的XML文档注释
2.3.8其他标记
第3章一般命名规范
3.1选用合适的名称
3.1.1使用字符的限制
3.1.2使用含义明确的英语
3.2大小写规则
3.2.1Pascal规则
3.2.2Camel规则
3.2.3首字母缩写词与简写词
3.2.4应在何时使用何种大小写规则
3.3考虑跨语言编程
3.3.1不要通过大小写区分标识符
3.3.2避免与其他语言的关键字重复
3.3.3避免使用特定语言的术语
3.4命名一致与冲突
3.4.1大小写无关原则
3.4.2对基类型的命名暗示
3.4.3对参数与属性的关系暗示
3.4.4属性名称与自身类型同名
3.4.5与命名空间相关的命名冲突
3.5匈牙利命名法
3.5.1匈牙利命名法的弊端
3.5.2考虑为控件应用匈牙利命名法
第4章处理数据
4.1关于数据类型
4.1.1整数
4.1.2浮点数
4.1.3布尔类型
4.1.4字符与字符串
4.2变量的使用
4.2.1尽可能使用内置关键字
4.2.2初始化一切变量
4.2.3集中使用变量
4.3使用枚举
4.3.1何时使用枚举
4.3.2如何为枚举命名
4.3.3关于枚举项
4.3.4标记枚举
4.4魔数——以字面数值出现在代码中的常量
4.5复杂的表达式
4.5.1运算符的副作用
4.5.2简化表达式
第5章分支结构
5.1使用if结构
5.1.1“==”与“=”的问题
5.1.2如何处理复杂的条件
5.2使用switch结构
5.2.1break语句
5.2.2使用default子句要注意的问题
5.3选择if还是switch?
5.4关于判断顺序的设计
5.4.1先判断最有可能成立的条件
5.4.2预防因条件短路而丢失操作
5.5慎用goto语句
第6章循环结构
6.1使用for还是while
6.1.1for和while的语义比较
6.1.2简单的数值迭代——for和while的思维模式的差j
6.1.3预知循环次数——微波炉加热的启示
6.1.4集合迭代——独特的foreach结构
6.2循环变量的使用
6.2.1循环变量的命名
6.2.2循环变量的定义
6.2.3避免循环变量的非常规应用
6.3提高循环效率
6.3.1避免不必要的重复劳动
6.3.2避免不必要的循环
第7章如何使用函数
7.1为什么要使用函数
7.1.1函数与方法
7.1.2代码复用
7.1.3隐藏细节——使用函数进行抽象
7.2函数重载
7.2.1重载的语义——为调用者提供方便
7.2.2保持核心代码唯一
7.3参数的设计
7.3.1参数的命名
7.3.2不要使用保留项.
7.3.3何时使用变长参数列表
7.3.4何时使用ref参数和out参数
7.3.5参数的顺序
7.3.6重载函数的参数一致性体现
7.4参数检查的必要性
7.4.1检查零值及空引用
7.4.2检查枚举类型
7.4.3防止数据被篡改
7.4.4在何处检查合法性
7.5函数的出口——离开函数的三种方式
7.5.1返回值的用法
7.5.2离开函数的时机
第8章结构与类
8.1结构与类的比较
8.1.1值类型与引用类型
8.1.2何时应当使用结构
8.1.3何时应当使用类
8.2结构与类的命名
8.2.1措辞
8.2.2避免与命名空间冲突
8.2.3不要使用“C”前缀
8.2.4后缀的使用
8.3如何搭建一个典型的结构
8.3.1找准核心数据
8.3.2数据的表现形式
8.3.3定义等价原则
8.3.4实现基本运算
8.4如何真正面向对象
第9章封装
9.1构造函数
9.1.1构造函数的语义
9.1.2何时使用静态构造方法
9.1.3构造函数的参数及其初始化
9.2Finalize函数
9.2.1垃圾回收器
9.2.2IDisposable接口——显式释放资源的方法
9.2.3释放资源的一般范式
9.3何时应该使用字段
9.3.1存储核心数据
9.3.2维持中间结果
9.3.3常量字段
9.4如何使用字段
9.4.1字段的命名
9.4.2访问控制
9.5何时应该使用属性
9.5.1属性的语义
9.5.2数据访问控制
9.5.3需要的后续操作
9.5.4简单的数据处理
9.5.5预定义的对象实例
9.6如何使用属性
9.6.1属性的命名
9.6.2访问控制
9.6.3提供合理的默认值
9.6.4保持轻量级的操作
9.6.5在属性中抛出异常
9.7何时应该使用方法
9.7.1表示某种操作
9.7.2耗时的任务——方法在形式上的暗示作用
9.7.3有副作用的操作
9.7.4返回不确定的值
9.7.5返回数组或集合对象
9.8如何使用方法
9.8.1方法的命名
9.8.2检查传入的参数
9.9静态类型及成员
9.10嵌套类型及其适用场合
9.11可变类型的安全性
9.12使用程序集与命名空间
9.12.1程序集的划分
9.12.2为什么要使用命名空间
9.12.3命名空间的命名
9.12.4命名空间的管理
第10章继承与多态
10.1如何利用类继承
10.1.1自上而下逐步细化
10.1.2自下而上逐步抽象
10.2继承限制
10.2.1强制继承的抽象类型
10.2.2密封类型
10.2.3扩展方法——直接向已有类型添加功能
10.3关于接口
10.3.1接口的语义
10.3.2接口的命名
10.3.3使用接口还是类继承
10.4何时应当显式实现接口
10.4.1解决接口之间的命名冲突
10.4.2提供强类型操作
10.4.3隐藏仅用于通过接口访问的成员
10.5使用多态
10.5.1何时应进行重写
10.5.2应当重写哪个成员
10.5.3保持参数名称一致
10.6运算符重载
10.6.1可重载的运算符
10.6.2符合运算符的本意
10.6.3运算符的关联性
10.6.4类型转换运算符的重载
第11章泛型机制
11.1装箱与取消装箱
11.2何时使用泛型
11.3泛型的类型参数设计
11.3.1类型参数的命名
11.3.2使用类型参数的时机
第12章事件与委托
12.1何为事件驱动模式
12.2如何响应事件
12.2.1事件处理函数
12.2.2代码的分配
12.2.3事件侦听器的使用
12.3如何提供事件
12.3.1何时应当提供事件
12.3.2事件的命名
12.3.3传递与事件相关的数据
12.3.4用于事件的委托及其要遵守的约定
12.3.5触发事件
12.4使用委托
12.4.1何时使用委托
12.4.2何时使用匿名方法
12.4.3基类型与派生类型
第13章集合类型
13.1系统内置集合类型
13.1.1数组
13.1.2列表
13.1.3字典
13.1.4其他类型
13.2选用适当的集合类型要考虑的几个方面
13.2.1容量
13.2.2进出次序
13.2.3定位的问题——索引/键访问
13.2.4元素结构
13.2.5排序
13.3性能比较
13.4提供自己的集合类型
13.4.1何时应提供集合类型
13.4.2集合类型的命名
13.4.3提供与内置集合类型一致的行为
13.4.4索引器及其应遵守的规则
13.4.5迭代器
第14章LINQ查询
14.1提高LINQ查询的效率
14.1.1查询语法和方法语法的区别
14.1.2LINQ查询的创建、执行与性能
14.1.3减少返回的数据量
14.2LINQ中的错误处理一一采用防御式编程
14.3LINQ查询的相关机制
14.3.1匿名类型
14.3.2隐式类型的局部变量
14.3.3Lambda表达式与匿名函数
第15章异常
15.1处理异常时应遵守的规范
15.2抛出异常
15.2.1异常的语义
15.2.2不应使用异常的位置
15.2.3控制异常
15.2.4异常的重新抛出——重新包装时要注意的
15.3选用合适的异常类型
15.3.1常见的异常类型
15.3.2不应使用的异常类型
15.4异常提示信息
15.5设计自定义异常及应遵循的约定
第16章全球化与本地化
16.1分离与特定区域相关的信息
16.2处理特定区域性的数据
16.2.1区分区域性与界面区域性
16.2.2在内部使用Unicode
16.2.3文本的比较与排序
16.2.4不要假定区域性的行为
16.3何时使用固定区域性
16.4用户界面应注意的细节
16.4.1使用资源
16.4.2术语
16.4.3界面布局
16.4.4歧义
16.4.5组合文本
附录A:C#、VB.NET、J#关键字表
附录B:常用的异常类型
……