Effective C#中文版:改善C#程序的50种方法
基本信息
- 作者: (美)Bill Wagner [作译者介绍]
- 译者: 李建忠
- 丛书名: 图灵程序设计丛书.NET系列
- 出版社:人民邮电出版社
- ISBN:9787115158888
- 上架时间:2007-4-25
- 出版日期:2007 年5月
- 开本:16开
- 页码:304
- 版次:1-1
- 所属分类:
计算机 > 软件与程序设计 > C#
编辑推荐
*业界专家经验荟萃
*讲述从优秀到卓越的秘诀
*涵盖 C# 2.0
推荐阅读
内容简介回到顶部↑
本书围绕一些重要的主题,包括c#语言元素、.net资源管理、使用c#表达设计、创建二进制组件和使用框架等,讲述了最常见的50个问题的解决方案,为程序员提供了在使用c#语言和.net库时如何提高编程效率的建议。本书通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容,为其在不同的情况下能够使用最佳的构造而提供指导。.
本书适于各种层次的c#程序员阅读,同时可以推荐给高校教师(尤其是软件学院教授c#/.net课程的老师),作为c#双语教学的参考书。
c#与c++、java等语言的相似性大大降低了学习难度,但是,c#所具有的大量独特的特性和实现细节,有时又会使程序员适得其反:他们往往根据既有经验,错误地选用了不恰当的技术,从而导致各种问题。与此同时,随着数年来c#的广泛应用,业界在充分利用c#的强大功能编写快速、高效和可靠的程序方面也积累了丰富的最佳实践。..
本书秉承了scott meyers的effective c++和joshua bloch的effective java所开创的伟大传统,用真实的代码示例,通过清晰、贴近实际和简明的阐述,以条款格式为广大程序员提供凝聚了业界经验结晶的专家建议。
本书中,著名.net专家bill wagner就如何高效地使用c#语言和.net库,围绕c#语言元素、.net资源管理、使用c#襄达设计、创建二进制组件和使用框架等重要主题,讲述了如何在不同情况下使用最佳的语言构造和惯用法,同时避免常见的性能和可靠性问题。其中许多建议读者都可以举一反三,立即应用到自己的日常编程工作中去。...
本书适于各种层次的c#程序员阅读,同时可以推荐给高校教师(尤其是软件学院教授c#/.net课程的老师),作为c#双语教学的参考书。
c#与c++、java等语言的相似性大大降低了学习难度,但是,c#所具有的大量独特的特性和实现细节,有时又会使程序员适得其反:他们往往根据既有经验,错误地选用了不恰当的技术,从而导致各种问题。与此同时,随着数年来c#的广泛应用,业界在充分利用c#的强大功能编写快速、高效和可靠的程序方面也积累了丰富的最佳实践。..
本书秉承了scott meyers的effective c++和joshua bloch的effective java所开创的伟大传统,用真实的代码示例,通过清晰、贴近实际和简明的阐述,以条款格式为广大程序员提供凝聚了业界经验结晶的专家建议。
本书中,著名.net专家bill wagner就如何高效地使用c#语言和.net库,围绕c#语言元素、.net资源管理、使用c#襄达设计、创建二进制组件和使用框架等重要主题,讲述了如何在不同情况下使用最佳的语言构造和惯用法,同时避免常见的性能和可靠性问题。其中许多建议读者都可以举一反三,立即应用到自己的日常编程工作中去。...
作译者回到顶部↑
本书提供作译者介绍
Bill Wagner是世界知名的.NET专家,微软CO领域的MVP,并荣获微软Regional Director称号。他是著名软件咨询公司SRT Solutions的创始人,有20多年软件开发经验,曾经领导了众多成功的Windows平台产品的开发。他是微软开发社区的活跃人物,长期担任MSDN Magazine、ASP.NET Pro、Visual Studio Magazine等技术杂志的专栏作者。他的blog是http://www.srtsolutions.com/public/blog/20574,可以通过wwagner@SRTSolutions.com与他联系。...
.. << 查看详细
.. << 查看详细
目录回到顶部↑
第1章 c#语言元素. 1
条款1:使用属性代替可访问的数据成员 1
条款2:运行时常量(readonly)优于编译时常量(const) 12
条款3:操作符is或as优于强制转型 17
条款4:使用conditional特性代替#if条件编译 25
条款5:总是提供tostring()方法 31
条款6:明辨值类型和引用类型的使用场合 38
条款7:将值类型尽可能实现为具有常量性和原子性的类型 44
条款8:确保0为值类型的有效状态 51
条款9:理解几个相等判断之间的关系 56
条款10:理解gethashcode()方法的缺陷 63
条款11:优先采用foreach循环语句 70
第2章 .net资源管理 77
条款12:变量初始化器优于赋值语句 82
条款13:使用静态构造器初始化静态类成员 84
条款14:利用构造器链 87
条款15:利用using和try/finally语句来清理资源 93
条款16:尽量减少内存垃圾 100
条款17:尽量减少装箱与拆箱 103
条款18:实现标准dispose模式 109
条款1:使用属性代替可访问的数据成员 1
条款2:运行时常量(readonly)优于编译时常量(const) 12
条款3:操作符is或as优于强制转型 17
条款4:使用conditional特性代替#if条件编译 25
条款5:总是提供tostring()方法 31
条款6:明辨值类型和引用类型的使用场合 38
条款7:将值类型尽可能实现为具有常量性和原子性的类型 44
条款8:确保0为值类型的有效状态 51
条款9:理解几个相等判断之间的关系 56
条款10:理解gethashcode()方法的缺陷 63
条款11:优先采用foreach循环语句 70
第2章 .net资源管理 77
条款12:变量初始化器优于赋值语句 82
条款13:使用静态构造器初始化静态类成员 84
条款14:利用构造器链 87
条款15:利用using和try/finally语句来清理资源 93
条款16:尽量减少内存垃圾 100
条款17:尽量减少装箱与拆箱 103
条款18:实现标准dispose模式 109
前言回到顶部↑
本书就如何高效地使用C#语言和.NET库,为程序员们提供了一些实用的建议。本书由50个关键条款(也可看作是50个小主题)组成,这些主题反映了我(及其他C#顾问)和C#开发人员共事时遇到的最常见问题。.
与很多C#开发人员一样,我是在从事10多年C++开发之后开始使用C#的。在这本书中,讨论了遵循C++实践可能会在使用C#时引发的问题。有一些使用C#的开发人员有着深厚的Java背景,他们可能会发现有些变化相当明显。因为从Java到C#,一些最佳实践发生了改变,我建议Java开发者对有关值类型的论述加以格外注意(参见第1章)。此外,.NET垃圾收集器和JVM垃圾收集器的行为方式也不尽相同(参见第2章)。
本书中的条款汇集了我最常提供给开发者的建议。虽然并非所有条款都是通用的,但大多数条款都可以很容易地应用到日常的编程工作中。这些条款涵盖了对属性(条款1)、条件编译(条款4)、常量性类型(条款7)、相等判断(条款9)、ICloneable(条款27)和new修饰符(条款29)的论述。我的经验是,在大多数情况下,减少开发时间和编写出色的代码应该是程序员的主要目标。某些科学和工程应用程序最重视的可能是系统的整体性能。对其他应用程序而言,凡事都应该围绕可伸缩性展开。对于不同的目标,可能会找到某些情况下比较重要(或不太重要)的信息。针对这一问题,我设法对各种目标进行了详细的解释说明。书中关于readonly和const(条款2)、可序列化的类型(条款25)、CLS兼容(条款31)、Web方法(条款34)和DataSet(条款41)的讨论针对某些特定的设计目标。这些目标在相应的条款中有清楚的说明,这样读者就可以在特定的情况下决定最适用的做法。
虽然本书中的每个条款都是独立的,但是这些条款是围绕一些重要的主题(如C#语法、资源管理和对象及组件设计)组织起来的,理解这一点非常重要。这并非无心之举。我的目的就是通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容。尽管如此,大家仍然不要忘了举一反三。对于特定的问题,本书也可以作为一个理想的查询工具。
要记住的是,本书并不是C#语言的教程或指南,也不是为了教授大家C#语法或结构。我的目标是为了让大家能够在不同的情况下使用最佳的构造而提供指导。
本书面向的读者
本书是为专业的开发人员,也就是那些在日常工作中使用C#的程序员们编写的。本书的阅读前提是读者有面向对象的编程经验,并且至少用过一种C系列语言(C、C++、C#或Java)。有Visual Basic 6背景的开发人员在阅读本书之前,应该先熟悉C#语法和面向对象设计。
另外,读者应该在.NET的重要领域有一些经验:Web Services、ADO.NET、Web Forms和Windows Forms。
为了充分利用本书,大家应该理解.NET环境处理程序集的方式、微软中间语言(MSIL)和可执行代码。C#编译器生成的程序集会包含MSIL,我经常将其简写为IL。加载程序集的时候, JIT(Just In Time)编译器会将MSIL转换为机器可执行的代码。C#编译器确实会执行一些优化,但是JIT编译器会负责处理很多更高效的优化,如内联。在书中,我对各种优化所涉及的过程进行了说明。这种两阶段的编译过程对于在不同情形下哪种构造的表现最佳有着很重要的影响。
本书内容
第1章“C#语言元素”讨论的是C#语法元素和System.Object的核心方法,System.Object是编写每一个类型都要涉及的。声明、语句、算法和System.Object接口,这些都是编写C#代码时必须时刻记住的主题。此外,与值类型和引用类型之间的区别直接相关的条款也都在本章。根据使用的是引用类型(类)还是值类型(结构),很多条款内容都有一些不同。在深入阅读本书之前,我强烈建议大家先阅读有关值类型和引用类型的讨论(条款6~8)。
第2章“.NET资源管理”涵盖了C#和.NET的资源管理问题。大家会学习如何针对.NET管理的执行环境优化资源分配和使用模式。是的,.NET垃圾收集器使我们的工作简单了很多。内存管理是环境的职责,而非开发人员的职责。但是,我们的行为对垃圾收集器在应用程序中的执行效果会产生大的影响。而且,尽管内存不是我们的问题,但管理非内存资源仍然是我们的职责,后者可以通过IDisposable进行处理。在这里,大家可以学习.NET中资源管理的最佳做法。..
第3章“使用C#表达设计”从C#的角度讲解了面向对象设计。C#提供了丰富的工具供我们使用。有时候,相同的问题可以用很多不同的方法解决:使用接口、委托、事件或者特性和反射。选用哪一种方式,对系统将来的可维护性会产生很大的影响。选择最佳的设计表示可以帮助程序员们更容易地使用类型。最自然的表示会使我们的意图更加清晰。这样,类型就会比较容易使用,而且不容易误用。第3章中的条款集中讲解了我们所做的设计决定,以及各种C#惯用法最适用的场合。
第4章“创建二进制组件”讲解了组件和语言互操作性。大家将学习如何在不牺牲C#功能的情况下,编写可被其他.NET语言使用的组件。还将学习如何将类细分成组件,来升级应用程序的某些部分。我们应该能在不重新发布整个应用程序的情况下发布组件的新版本。
第5章“使用框架”讲解了.NET框架未充分使用的部分。我看到很多开发人员非常希望创建自己的软件,而不是使用已经构建好的软件。这可能是由.NET框架的体积造成的,也可能因为框架是全新的。这些条款涵盖了框架中那些我曾见过开发人员做重复劳动、而非使用业已存在的功能的部分。通过学习更高效地使用框架,大家可以节省宝贵的时间。
第6章“杂项讨论”以不适合其他分类的条款以及对未来的展望作为全书的结尾。有关C# 2.0、标准、异常安全(exception-safe)的代码、安全和互操作的信息,都可以在这里找到。
关于条款
我写这些条款是为了向大家提供编写C#软件的简洁明了的建议。书中有一些指导方针是通用的,因为它们会影响程序的正确性,如正确初始化数据成员(参见第2章)。有一些指导方针不是很容易理解,并且在.NET社区中引发过很多争论,如是否使用ADO.NET DataSet。我个人认为使用它们可以节省很多时间(参见条款41),其他一些专业的程序员,同时也是我非常尊敬的程序员,对此并不同意。它其实取决于我们正在构建的软件性质。我的立场是尽量节省时间。如果是编写大量在基于.NET和基于Java的系统之间传输信息的软件,DataSet就是个糟糕的主意。在整本书中,我为所做的全部建议都给出了正当的理由。如果其理由并不适用于你碰到的情况,那就不要采纳书中的建议。当建议是普遍适用时,我通常会省略其显而易见的理由:如果不这样做,程序就起不了作用。
版式和代码约定
写编程语言的图书的一个困难之处就是,语言设计者为一些英文单词赋予了非常特殊的新含义。这就导致了一些很难理解的句子。“Develop interfaces with interfaces”就是一个例子。我在使用语言关键字时,都采用了代码体。
与很多C#开发人员一样,我是在从事10多年C++开发之后开始使用C#的。在这本书中,讨论了遵循C++实践可能会在使用C#时引发的问题。有一些使用C#的开发人员有着深厚的Java背景,他们可能会发现有些变化相当明显。因为从Java到C#,一些最佳实践发生了改变,我建议Java开发者对有关值类型的论述加以格外注意(参见第1章)。此外,.NET垃圾收集器和JVM垃圾收集器的行为方式也不尽相同(参见第2章)。
本书中的条款汇集了我最常提供给开发者的建议。虽然并非所有条款都是通用的,但大多数条款都可以很容易地应用到日常的编程工作中。这些条款涵盖了对属性(条款1)、条件编译(条款4)、常量性类型(条款7)、相等判断(条款9)、ICloneable(条款27)和new修饰符(条款29)的论述。我的经验是,在大多数情况下,减少开发时间和编写出色的代码应该是程序员的主要目标。某些科学和工程应用程序最重视的可能是系统的整体性能。对其他应用程序而言,凡事都应该围绕可伸缩性展开。对于不同的目标,可能会找到某些情况下比较重要(或不太重要)的信息。针对这一问题,我设法对各种目标进行了详细的解释说明。书中关于readonly和const(条款2)、可序列化的类型(条款25)、CLS兼容(条款31)、Web方法(条款34)和DataSet(条款41)的讨论针对某些特定的设计目标。这些目标在相应的条款中有清楚的说明,这样读者就可以在特定的情况下决定最适用的做法。
虽然本书中的每个条款都是独立的,但是这些条款是围绕一些重要的主题(如C#语法、资源管理和对象及组件设计)组织起来的,理解这一点非常重要。这并非无心之举。我的目的就是通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容。尽管如此,大家仍然不要忘了举一反三。对于特定的问题,本书也可以作为一个理想的查询工具。
要记住的是,本书并不是C#语言的教程或指南,也不是为了教授大家C#语法或结构。我的目标是为了让大家能够在不同的情况下使用最佳的构造而提供指导。
本书面向的读者
本书是为专业的开发人员,也就是那些在日常工作中使用C#的程序员们编写的。本书的阅读前提是读者有面向对象的编程经验,并且至少用过一种C系列语言(C、C++、C#或Java)。有Visual Basic 6背景的开发人员在阅读本书之前,应该先熟悉C#语法和面向对象设计。
另外,读者应该在.NET的重要领域有一些经验:Web Services、ADO.NET、Web Forms和Windows Forms。
为了充分利用本书,大家应该理解.NET环境处理程序集的方式、微软中间语言(MSIL)和可执行代码。C#编译器生成的程序集会包含MSIL,我经常将其简写为IL。加载程序集的时候, JIT(Just In Time)编译器会将MSIL转换为机器可执行的代码。C#编译器确实会执行一些优化,但是JIT编译器会负责处理很多更高效的优化,如内联。在书中,我对各种优化所涉及的过程进行了说明。这种两阶段的编译过程对于在不同情形下哪种构造的表现最佳有着很重要的影响。
本书内容
第1章“C#语言元素”讨论的是C#语法元素和System.Object的核心方法,System.Object是编写每一个类型都要涉及的。声明、语句、算法和System.Object接口,这些都是编写C#代码时必须时刻记住的主题。此外,与值类型和引用类型之间的区别直接相关的条款也都在本章。根据使用的是引用类型(类)还是值类型(结构),很多条款内容都有一些不同。在深入阅读本书之前,我强烈建议大家先阅读有关值类型和引用类型的讨论(条款6~8)。
第2章“.NET资源管理”涵盖了C#和.NET的资源管理问题。大家会学习如何针对.NET管理的执行环境优化资源分配和使用模式。是的,.NET垃圾收集器使我们的工作简单了很多。内存管理是环境的职责,而非开发人员的职责。但是,我们的行为对垃圾收集器在应用程序中的执行效果会产生大的影响。而且,尽管内存不是我们的问题,但管理非内存资源仍然是我们的职责,后者可以通过IDisposable进行处理。在这里,大家可以学习.NET中资源管理的最佳做法。..
第3章“使用C#表达设计”从C#的角度讲解了面向对象设计。C#提供了丰富的工具供我们使用。有时候,相同的问题可以用很多不同的方法解决:使用接口、委托、事件或者特性和反射。选用哪一种方式,对系统将来的可维护性会产生很大的影响。选择最佳的设计表示可以帮助程序员们更容易地使用类型。最自然的表示会使我们的意图更加清晰。这样,类型就会比较容易使用,而且不容易误用。第3章中的条款集中讲解了我们所做的设计决定,以及各种C#惯用法最适用的场合。
第4章“创建二进制组件”讲解了组件和语言互操作性。大家将学习如何在不牺牲C#功能的情况下,编写可被其他.NET语言使用的组件。还将学习如何将类细分成组件,来升级应用程序的某些部分。我们应该能在不重新发布整个应用程序的情况下发布组件的新版本。
第5章“使用框架”讲解了.NET框架未充分使用的部分。我看到很多开发人员非常希望创建自己的软件,而不是使用已经构建好的软件。这可能是由.NET框架的体积造成的,也可能因为框架是全新的。这些条款涵盖了框架中那些我曾见过开发人员做重复劳动、而非使用业已存在的功能的部分。通过学习更高效地使用框架,大家可以节省宝贵的时间。
第6章“杂项讨论”以不适合其他分类的条款以及对未来的展望作为全书的结尾。有关C# 2.0、标准、异常安全(exception-safe)的代码、安全和互操作的信息,都可以在这里找到。
关于条款
我写这些条款是为了向大家提供编写C#软件的简洁明了的建议。书中有一些指导方针是通用的,因为它们会影响程序的正确性,如正确初始化数据成员(参见第2章)。有一些指导方针不是很容易理解,并且在.NET社区中引发过很多争论,如是否使用ADO.NET DataSet。我个人认为使用它们可以节省很多时间(参见条款41),其他一些专业的程序员,同时也是我非常尊敬的程序员,对此并不同意。它其实取决于我们正在构建的软件性质。我的立场是尽量节省时间。如果是编写大量在基于.NET和基于Java的系统之间传输信息的软件,DataSet就是个糟糕的主意。在整本书中,我为所做的全部建议都给出了正当的理由。如果其理由并不适用于你碰到的情况,那就不要采纳书中的建议。当建议是普遍适用时,我通常会省略其显而易见的理由:如果不这样做,程序就起不了作用。
版式和代码约定
写编程语言的图书的一个困难之处就是,语言设计者为一些英文单词赋予了非常特殊的新含义。这就导致了一些很难理解的句子。“Develop interfaces with interfaces”就是一个例子。我在使用语言关键字时,都采用了代码体。








点击看大图







加载中...

