1、Effective C# 中文版 改善 C#程序的 50 种方法Effective C# 中文版 改善 C#程序的 50 种方法1/180内容提要 .3编辑推荐 .3前言 .4本书面向的读者 .4本书内容 .5关于条款 .5版式和代码约定 .6关于 C# 2.0 .6致谢 .7第一章 C#语言元素 .9原则 1:始终能的使用属性(property),而不是可直接访问的 Data Member.9原则 2:为你的常量选择 readonly 而不是 const.14原则 3:选择 is 或者 as 操作符而不是做强制类型转换 .17原则 4:用条件属性而不是#if .23原则 5:始终提供 ToS
2、tring() .26原则 6:区别值类型数据和引用类型数据 .31原则 7:选择恒定的原子值类型数据 .34原则 8:确保 0 对于值类型数据是有效的 .39原则 9:明白几个相等运算之间的关系 .42原则 10:明白 GetHashCode()的缺陷 .46原则 11:选择 foreach 循环 .50第二章 .Net 资源管理 .53原则 12:选择变量初始化而不是赋值语句 .56原则 13:用静态构造函数初始化类的静态成员 .57原则 14:使用构造函数链 .59原则 15:使用 using 和 try/finally 来做资源清理 .63原则 16:垃圾最小化 .67原则 17:装箱
3、和拆箱的最小化 .69原则 18:实现标准的处理(Dispose)模式 .73第三章 用 C#表达你的设计 .76原则 19:选择定义和实现接口,而不是继承 .77原则 20:明辨接口实现和虚函数重载的区别 .81原则 21:用委托来表示回调 .83原则 22:用事件定义对外接口 .84原则 23:避免返回内部类对象的引用 .89原则 24:选择申明式编程而不是命令式编程 .91原则 25: 让你的类型支持序列化 .95原则 26:用 IComparable 和 IComparer 实现对象的顺序关系 .100原则 27:避免使用 ICloneable.104原则 28:避免转换操作 .107
4、原则 29:仅在对基类进行强制更新时才使用 new 修饰符 .109第四章 创建基于二进制的组件 .111原则 30:选择与 CLS 兼容的程序集 .113Effective C# 中文版 改善 C#程序的 50 种方法2/180原则 31:选择小而简单的函数 .116原则 32:选择小而内聚的程序集 .118原则 33:限制类型的访问 .120原则 34:创建大容量的 Web API .122第五章 和 Framework 一起工作 .125原则 35:选择重写函数而不是使用事件句柄 .125原则 36:利用.Net 运行时诊断 .127原则 37:使用标准的配置机制 .130原则 38:使
5、用和支持数据绑定 .132原则 39:使用.Net 验证 .136原则 40:根据需求选择集合 .139原则 41:选择 DataSet 而不是自定义的数据结构 .144原则 42:使用特性进行简单的反射 .151原则 43:请勿滥用反射 .155原则 44:创建应用程序特定的异常类 .158第六章 杂项 .161原则 45:选择强异常来保护程序 .162原则 46:最小化与其它非托管代码的交互 .164原则 47:选择安全的代码 .168原则 48:了解更多的工具和资源 .170原则 49:为 C#2.0 做好准备 .172原则 50:了解 ECMA 标准 .177s.177Effectiv
6、e C# 中文版 改善 C#程序的 50 种方法3/180内容提要本书围绕一些关于 C#和.NET 的重要主题,包括 C#语言元素、.NET 资源管理、使用 C#表达设计、创建二进制组件和使用框架等,讲述了最常见的 50 个问题的解决方案,为程序员提供了改善C#和.NET 程序的方法。本书通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容,为其在不同情况下使用最佳构造提供指导。本书适合各层次的 C#程序员阅读,同时可以推荐给高校教师(尤其是软件学院教授 C#/.NET课程的老师),作为 C#双语教学的参考书。作者简介Bill wagner 是世界知名的
7、NET 专家,微软 C#领域的 MVP,并荣获微软 Regional Director称号。他是著名软件咨询公司 SRT Solutions 的创始人,有 20 多年软件开发经验,曾经领导了众多成功的 Windows 平台产品的开发。他是微软开发社区的活跃人物,长期担任 MSDN Magazine、ASPNET Pro、Visual Studio Magazine 等技术杂志的专栏作者。他的 blog 是http:/ public/blog/20574,可以通过 wwagnerSR7S 与他联系。编辑推荐业界专家经验荟萃,讲述从优秀到卓越的秘诀,涵盖 C#2.0。“一直以来,读者们总在不停地问
8、我,什么时候写 Effective C#?本书的出版使我如释重负。令人高兴的是,我本人已经从阅读 Bill 的著作中获益良多,相信读者也会和我一样。”Scott Meyers,Effective C+作者,世界级面向对象技术专家C#与 C+、Java 等语言的相似性大大降低了学习难度。但是,C#所具有的大量独特的特性和实现细节。有时又会使程序员适得其反:他们往往根据既有经验,错误地选用了不恰当的技术。从而导致各种问题。与此同时,随着数年来 C#的广泛应用,业界在充分利用 C#的强大功能编写快速、高效和可靠的程序方面也积累了丰富的最佳实践。本书秉承了 Scott Meyers 的 Effecti
9、ve C+和 Joshua Bloch 的 Effective Java 所开创的伟大传统用真实的代码示例,通过清晰、贴近实际和简明的阐述,以条款格式为广大程序员提供凝聚了业界经验结晶的专家建议。本书中,著名.NET 专家 Bill Wagner 就如何高效地使用 C#语言和NET 库。围绕 C#语言元素、NET 资源管理、使用 C#表达设计、创建二进制组件和使用框架等重要主题,讲述了如何在不同情况下使用最佳的语言构造和惯用法,同时避免常见的性能和可靠性问题。其中许多建议读者都可以举一反三。立即应用到自己的日常编程工作中去。Effective C# 中文版 改善 C#程序的 50 种方法4/1
10、80前言本书就如何高效使用 C#语言和.NET 库,为程序员们提供了一些实用的建议。本书由 50 个关键条款(也可看作是 50 个小主题)组成,这些主题反映了我(及其他 C#顾问)和 C#开发人员共事时遇到的最常见问题。与很多 C#开发人员一样,我是在从事 10 多年 C+开发之后开始使用 C#的。在本书中,讨论了哪些情况下遵循 C+实践可能会在使用 C#时引发的问题。有一些使用 C#的开发人员有着深厚的Java 背景,他们可能会发现有些变化相当明显。因为从 Java 到 C#,一些最佳实践发生了改变,我建议 Java 开发者要格外注意有关值类型的论述(参见第 1 章)。此外,.NET 垃圾收
11、集器和 JVM 垃圾收集器的行为方式也不尽相同(参见第 2 章)。本书中的条款汇集了我最常提供给开发者的建议。虽然并非所有条款都是通用的,但大多数条款都可以很容易地应用到日常的编程工作中。这些条款涵盖了对属性(条款 1)、条件编译(条款4)、常量性类型(条款 7)、相等判断(条款 9)、ICloneable(条款 27)和 new 修饰符(条款29)的论述。我的经验是,在大多数情况下,减少开发时间和编写出色的代码应该是程序员的主要目标。某些科学和工程应用程序最重视的可能是系统的整体性能。对其他应用程序而言,凡事都应该围绕可伸缩性展开。对于不同的目标,可能会找到某些情况下比较重要(或不太重要)的
12、信息。针对这一问题,我设法对各种目标进行了详细的解释说明。书中关于 readonly 和 const(条款 2)、可序列化的类型(条款 25)、CLS 兼容(条款 30)、Web 方法(条款 34)和 DataSet(条款 41)的讨论针对某些特定的设计目标。这些目标在相应的条款中有清楚的说明,这样读者就可以在特定的情况下决定最适用的做法。虽然本书中的每个条款都是独立的,但是这些条款是围绕一些重要的主题(如 C#语法、资源管理和对象及组件设计)组织起来的,理解这一点非常重要。这并非无心之举。我的目的就是通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容
13、。尽管如此,大家仍然不要忘了举一反三。对于特定的问题,本书也可以作为一个理想的查询工具。要记住的是,本书并不是 C#语言的教程或指南,也不是为了教授大家 C#语法或结构。我的目标是为大家在不同的情况下使用什么语言构造最好提供指导。本书面向的读者本书是为专业的开发人员,也就是那些在日常工作中使用 C#的程序员们编写的。本书的阅读前提是读者有面向对象的编程经验,并且至少用过一种 C 系列语言(C、C+、C#或 Java)。有Visual Basic 6 背景的开发人员在阅读本书之前,应该先熟悉 C#语法和面向对象设计。另外,读者应该在.NET 的重要领域有一些经验:Web Services、ADO
14、.NET、Web Forms 和Windows Forms。为了充分利用本书,大家应该理解.NET 环境处理程序集的方式、微软中间语言(MSIL)和可执行代码。C#编译器生成的程序集会包含 MSIL,我经常将其简写为 IL。加载程序集的时候, JIT(Just In Time)编译器会将 MSIL 转换为机器可执行的代码。C#编译器确实会执行一些优化,但是 JIT 编译器会负责处理很多更高效的优化,如内联。在书中,我对各种优化所涉及的过程进行了说明。这种两阶段的编译过程对于在不同情形下哪种构造的表现最佳有着很重要的影响。Effective C# 中文版 改善 C#程序的 50 种方法5/180
15、本书内容第 1 章“C#语言元素”讨论的是 C#语法元素和 System.Object 的核心方法,System.Object 是编写每一个类型都要涉及的。声明、语句、算法和 System.Object 接口,这些都是编写 C#代码时必须时刻记住的主题。此外,与值类型和引用类型之间的区别直接相关的条款也都在本章。根据使用的是引用类型(类)还是值类型(结构),很多条款内容都有一些不同。在深入阅读本书之前,我强烈建议大家先阅读有关值类型和引用类型的讨论(条款 68)。第 2 章“.NET 资源管理”涵盖了 C#和.NET 的资源管理问题。大家会学习如何针对.NET 管理的执行环境优化资源分配和使用
16、模式。是的,.NET 垃圾收集器使我们的工作简单了很多。内存管理是环境的职责,而非开发人员的职责。但是,我们的行为对垃圾收集器在应用程序中的执行效果会产生大的影响。而且,尽管内存不是我们的问题,但管理非内存资源仍然是我们的职责,后者可以通过 IDisposable 进行处理。在这里,大家可以学习.NET 中资源管理的最佳做法。第 3 章“使用 C#表达设计”从 C#的角度讲解了面向对象设计。C#提供了丰富的工具供我们使用。有时候,相同的问题可以用很多不同的方法解决:使用接口、委托、事件或者特性和反射。选用哪一种方式,对系统将来的可维护性会产生很大的影响。选择最佳的设计表示可以帮助程序员们更容易
17、地使用类型。最自然的表示会使我们的意图更加清晰。这样,类型就会比较容易使用,而且不容易误用。第 3 章中的条款集中讲解了我们所做的设计决定,以及各种 C#惯用法最适用的场合。第 4 章“创建二进制组件”讲解了组件和语言互操作性。大家将学习如何在不牺牲 C#功能的情况下,编写可被其他.NET 语言使用的组件。还将学习如何将类细分成组件,来升级应用程序的某些部分。我们应该能在不重新发布整个应用程序的情况下发布组件的新版本。第 5 章“使用框架”讲解了.NET 框架未充分使用的部分。我看到很多开发人员非常希望创建自己的软件,而不是使用已经构建好的软件。这可能是由.NET 框架的体积造成的,也可能因为
18、框架是全新的。这些条款涵盖了框架中那些我曾见过开发人员做重复劳动、而非使用业已存在的功能的部分。通过学习更高效地使用框架,大家可以节省宝贵的时间。第 6 章“杂项讨论”以不适合其他分类的条款以及对未来的展望作为全书的结尾。有关 C# 2.0、标准、异常安全(exception-safe)的代码、安全和互操作的信息,都可以在这里找到。关于条款我写这些条款是为了向大家提供编写 C#软件的简洁明了的建议。书中有一些指导方针是通用的,因为它们会影响程序的正确性,如正确初始化数据成员(参见第 2 章)。有一些指导方针不是很容易理解,并且在.NET 社区中引发过很多争论,如是否使用 ADO.NET Dat
19、aSet。我个人认为使用它们可以节省很多时间(参见条款 41),其他一些专业的程序员,同时也是我非常尊敬的程序员,对此并不同意。它其实取决于我们正在构建的软件性质。我的立场是尽量节省时间。如果是编写大量在基于.NET 和基于 Java 的系统之间传输信息的软件,DataSet 就是个糟糕的主意。在整本书中,我为所做的全部建议都给出了理由。如果其理由并不适用于你碰到的情况,那就不要采纳书中的建议。当建议是普遍适用时,我通常会省略其显而易见的理由:如果不这样做,程序就起不了作用。Effective C# 中文版 改善 C#程序的 50 种方法6/180版式和代码约定写编程语言图书的一个困难之处在于
20、,语言设计者用一些英文单词表示非常特殊的新含义,这就导致了一些很难理解的句子。“Develop interfaces with interfaces”就是一个例子。因此,我在使用语言关键字时,都采用了代码体。本书使用了很多相关的 C#术语。在提到类型的成员时,它是指可以成为类型的一部分的任何定义:方法、属性、字段、索引器、事件、枚举或者委托。当应用的只是一种定义时,我会使用一个更加具体的术语。对于书中的许多术语,大家可能熟悉,也可能还不熟悉。当这些术语第一次在正文中出现时,它们会以楷体形式表现,并给出定义。本书的范例都是简短、专注的代码段,以示范特定条款中的建议。列出它们是为了强调遵循建议的好
21、处。它们并不是可以加入到读者当前程序中的完整范例。大家不能简单地复制代码清单,然后编译它们。所有代码清单我都省略了很多细节。在所有情况下,我们都预设已存在如下常用的using 语句:using System;using System.IO;using System.Collections;using System.Data;当使用不太常见的命名空间时,我会确保让读者看到相关的命名空间。简短的范例会使用完全限定类名称,而长的范例则会包含不太常用的 using 语句。范例中的代码也比较随意。例如,当显示下列代码时:string s1 = GetMessage();如果和论述的内容无关,我可能不会显
22、示 GetMessage()例程的主体。当我省略代码时,读者可以假定缺失的方法做的是一些明显且合理的事情。我这样做的目的是为了让我们把焦点聚在特殊的主题上。通过省略和主题无关的代码,我们的注意力就不会分散。这样还能让各个条款保持简短,以使大家能够在短时间内完成学习。关于 C# 2.0我之所以对新的 C# 2.0 版本所言甚少,有两个原因。首先,本书中的大部分建议也同样适用于 C# 2.0。虽然 C# 2.0 是一个非常重大的升级版本,但它是建立在 C# 1.0 基础之上的,且并没有让现如今的建议失效。对于最佳实践有可能发生变化的地方,我已经在文中给出了说明。第二个原因是现在编写新的 C# 2.
23、0 功能的高效用法还为时过早。本书的内容是基于我以及我的同事使用 C# 1.0 的已有经验。我们对于 C#2.0 中的新功能还没有足够的经验,因而也就不了解能够应用到日常任务中的最佳做法。当在书中编写 C# 2.0 新功能的高效用法的时机还未成熟时,我并不想误导读者。建议、反馈及获取本书的更新内容本书内容基于我的经验以及和同事们的交流。如果读者有不同的经验,或者有任何疑问或意见,我愿洗耳恭听。请通过电子邮件和我联系:。我会把这些意见放在网上,作为本书的延伸。登录 C# 中文版 改善 C#程序的 50 种方法7/180致谢虽然写作似乎是一件孤独的事情,但本书却是一大群人的成果。我非常幸运,认识
24、两位出色的编辑 Stephane Nakib 和 Joan Murray。Stephane Nakib 第一次联系我为 Addison Wesley 写作是在一年多以前。我当时心存疑虑,因为书店里到处都是.NET 和 C#方面的书籍。在 C# 2.0 面世了足够的时间,可以大书特书之前,我一直看不出为 C#和.NET 再写一本参考书、教程或编程书籍的必要性。我们讨论过好几个想法,话题总是回到写一本有关 C#最佳实践的图书。在进行这些讨论的过程中,Stephane 告诉我,Scott Meyers 开始着手主编一个 Effective 系列,其风格延续了他的Effective C+系列图书。我买
25、的 Scott 的三本书都被我翻得非常破旧。我还将它们推荐给了我认识的每一位专业 C+程序员。他的写作风格清晰而简明。每一个建议条款都有过硬的理由。Effective 丛书是很好的资源,而且其体例使得读者很容易就能记住其中的建议。我认识很多 C+开发人员,他们复印了书的目录,并把它钉在书房的墙上,不断提醒自己。Stephane 一提到写作Effective C#的想法,我就欣然接受了这个机会。这本书把我曾为 C#开发人员给出的所有建议收录在一起。我很荣幸能成为该系列图书的一个作者。和 Scott 一起工作让我学到了很多东西。我真心希望本书能够像 Scott 的书提高了我的 C+技巧那样,帮助大
26、家提高 C#应用技巧。Stephane 帮助落实了写作 Effective C#的想法,她审读了提纲和草稿,并在该书的早期写作过程中给予了充分的支持。当她抽身离开的时候,Joan Murray 接管了这个项目,并毫无倦怠地负责了原稿的写作管理。Ebony Haight 作为编辑助理,在整个过程中提供了不间断的帮助。Krista Hansing 完成了所有编辑和转换编程行话的工作。Christy Hackerd 完成了所有把 Word 文档转变为成书的工作。书中如有错误,应由我来负责。出色的审稿团队修改了绝大多数的错误、冗长和表述不清的问题。最值得一提的是,Brian Noyes、Rob Steel、Josh Holmes 和 Doug Holland 使得最终的正文比初期的草稿更加正确和有用。另外,还要感谢安阿伯计算机学会、大湖区.NET 用户组、Greater
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。