C#技术揭秘
基本信息
- 原书名: Second Edition
- 原出版社: Microsoft
- 作者: [美]Tom Archer,Andrew Whitechapel [作译者介绍]
- 译者: 马朝晖
- 丛书名: 微软公司核心技术书库
- 出版社:机械工业出版社
- ISBN:7111122577
- 上架时间:2003-7-22
- 出版日期:2003 年7月
- 开本:16开
- 页码:597
- 版次:1-1
- 所属分类:
计算机 > 软件与程序设计 > C#
内容简介回到顶部↑
本书在前一版基础上进行了全面更新,是全球公认的最佳c#图书。全书从c#语言基础,讲到代码的编写,最后深入讨论c#语言的内部架构。其间通过大量实用的代码示例和应用演示程序循序渐进地教你如何使用c#。让你知其然,更知其所以然
本书详细介绍了c#的特点、新增功能以及它与c和c++的异同,是一本真正揭示c#技术内幕的书籍。
本书既适合c#的初学者阅读,也适合已经使用过c#语言进行编程并希望掌握高级功能的开发人员参考。
本书详细介绍了c#的特点、新增功能以及它与c和c++的异同,是一本真正揭示c#技术内幕的书籍。
本书既适合c#的初学者阅读,也适合已经使用过c#语言进行编程并希望掌握高级功能的开发人员参考。
作译者回到顶部↑
本书提供作译者介绍
Tom A rcher 他是深受世界程序员爱戴的技术专家。拥有18年的开发经验,曾供职子IBM。AT&T等公司,编写过在业界占领先地位的垂直市场(vertical market)软件和获奖的盒装应用程序。他曾是著名技术网站CodeGuru的负责人,目前仍然通过各种形式支持着开发社区。
Andrew Whitechapel拥有20多年的软件业工作经验,他还是Organic软件公司的CEO,该公司主要为软件行业提供咨询和培训服务。当C#/.NET还在公共beta版时,他就开发了好几个C#/.NET项目。
.. << 查看详细
Andrew Whitechapel拥有20多年的软件业工作经验,他还是Organic软件公司的CEO,该公司主要为软件行业提供咨询和培训服务。当C#/.NET还在公共beta版时,他就开发了好几个C#/.NET项目。
.. << 查看详细
目录回到顶部↑
第一部分 c#类的基本原理
第1章 建立c#应用程序和库
1.1 "hello,world"--命令行版本
1.2 "hello,world"的代码解释
1.2.1 一站式编程
1.2.2 名称空间
1.2.3 类和成员
1.2.4 main方法
1.2.5 system.console.writeline方法
1.2.6 名称空间和using指令
1.2.7 框架代码
1.2.8 类的二义性
1.3 "hello,world"--visual studio.net版本
1.4 编译和运行.net应用程序
1.5 "hello,world"内部
1.6 配件和模块
1.6.1 配件概述
1.6.2 配件的好处
1.6.3 构建配件
1.6.4 创建共享配件
第1章 建立c#应用程序和库
1.1 "hello,world"--命令行版本
1.2 "hello,world"的代码解释
1.2.1 一站式编程
1.2.2 名称空间
1.2.3 类和成员
1.2.4 main方法
1.2.5 system.console.writeline方法
1.2.6 名称空间和using指令
1.2.7 框架代码
1.2.8 类的二义性
1.3 "hello,world"--visual studio.net版本
1.4 编译和运行.net应用程序
1.5 "hello,world"内部
1.6 配件和模块
1.6.1 配件概述
1.6.2 配件的好处
1.6.3 构建配件
1.6.4 创建共享配件
译者序回到顶部↑
刚听说C#时,有人告诉我C#是一种简化版的C++。但是了解了C#之后,特别是在翻译完本书之后,我发现这种说法相当不准确。有这种说法似乎是因为C#限制了(并没有取消)对指针的使用,并且取消了一些最难于理解的C++概念。依我之见,C#是C++语言向Java妥协的标志。这种说法也许有点儿夸张,但是你看过本书就会或多或少地体会到我的意思。书中多处提到Java程序员可以猜出代码的效果,而C++程序员会吃惊。实际情况确实如
此,如果你同时掌握Java和C++,那么当你看到某些C#功能时你会情不自禁地说:“这太Java了。”所以,我甚至可以建议:如果你只具有C++背景,那么不妨先学习Java,再回头学习C#。
好在,我几年前已经从C++转向了Java,所以我觉得学习C#并不难。但是我想C++程序员会很不习惯,因此我自作主张将书中提到的C#与C++的差异收集起来,供C++程序员参考(见下表);其中主要列出了改变的地方,增加的功能总结得不全。这些改变的影响各有不同,有的非常好,有的可能会造成麻烦,有的可以不用理会;我想你有能力判断各种改变的影响属于什么性质。但是,增加的功能基本上都很出色。
Microsoft在C#中所做的主要改进在以下几个方面:
·首先是增强了C语言面向对象的程度。C++在近几年似乎丧失了“面向对象”的荣誉,而降成了“基于对象的”。的确,C#在这方面大有改进。单根的对象层次结构,所有对象都最终派生自System.Object,取消了全局方法,等等;这些都提高了面向对象的程度。
·提高代码的优雅程度。准确地说,主要是提高客户代码的优雅程度。第5章开头说的话非常正确,“系统被简化到一定程度之后,进一步简化的惟一方法就是转移复杂性,将最复杂的工作转移到适合处理它的部分中去。”对于语言来说,就是让类的编写者付起更大的责任,让类的客户更轻松。优雅指的是采用自然而且简便的方式。像特性这样的功能确实很优雅。当然,转移复杂性并不能减小复杂性,客户轻松了,类的编写者就费劲了。但这种原则是正确的,毕竟,最了解类的人是类的编写者。在崇尚可重用性的今天,迫使客户详细研究类,还要记住一堆特殊规则,对于重用是很不利的。
力求优雅和自然,这可能是C#给我的最大启示了,我们在自己的程序设计工作中应该时刻想着客户。’打个比方,你要是买了一台电视机,你肯定不愿意查看它的电路图,
然后拿起螺丝刀(甚至是电烙铁)在机器里折腾一小时后才能看电视。你希望插上电源和天线,一按遥控器就行了,而且希望遥控器按钮的功能一目了然。这就是自然。
·提供了.NET语言之间的互操作性。这主要是通过MSIL和通用类型系统实现的。MSIL借用了Java字节代码的中间语言概念,但仅仅是借用了概念,它还是局限于Windows的范围。而通用类型系统算是一个成果,而不是成就;既然Microsoft控制着VC、VB等语言,那么这些语言的数据类型不能完全兼容是很荒谬的,现在Microsoft做了早就应该做的事。
这本书的原文中许多地方非常晦涩,用的词汇也常常很偏,翻译起来很难,我们用了很长时间才完成翻译工作。我们在翻译过程中不得不进行了一定程度的意译,我们确信已经尽力保持了原文的意思,而且纠正了原书的一些明显错误。如果你有幸得到本书的原文,希望你不要纯粹从字面评价本译稿(这对程序员是没有意义的)。当然,因为我们的水平有限,而且不可能保证没有疏漏,所以欢迎你指出书中的实质性错误。由于原文比较晦涩,加之我们的语言水平有限,译稿可能不够流畅,请见谅。
原文虽然难读,但是作者的某些见解还是很精彩的。比如,作者指出goto语句并不是毫无可取之处,这的确很有道理。我和大家一样在学习编程的时候,就被告之要避免使用goto语句,这已经形成了一种教条。我也习惯了不使用goto语句,这往往是因为有些语言取消了goto语句;即使语言支持goto语句,我也不用它,这可能是因为怕别人嘲笑我无知。我说这么多,
并不是想说goto语句是多么必要,而是感到很佩服作者挑战教条的勇气。作为程序员,我们不但应该掌握进行创造性工作的技能,而且应该具有相应的勇气。
另外,本书中使用的术语没有完全按照.NET中文版的译法,因为我们认为其中的一些译法并不合适。比如assembly,.NET中文版译为“程序集”,这个译文实在太模糊,太松散了,所以我们使用“配件”这个词。对于新术语,我们参考了.NET中文版、技术网站和讨论组中的译法,经过讨论之后确定译法(我们做决定的标准在很大程度上也是“是否自然”)。也许你所习惯的译文与我们的不同,但是我们希望这些不一致的地方不会影响你阅读本书;毕竟,作为一个有实力学习技术内幕类书籍的程序员,你所关注的肯定不是文字,而是文字的含义。
公平地说,C#对C++进行了很多很有价值的改进,是一门值得学习的语言。但是,有些地方确实值得商榷。比如,对象赋值的效果对于C++程序员是很难习惯的,而且C++原来的方式并不太差(至少提供了选择方案)。
C语言系列的这种发展方向是否是好现象?答案肯定是见仁见智的。可以肯定的是,这种发展至少在一定程度上是正确的,因为Java确实具有C所缺乏的一些特质。问题只是这种同化的程度。从好的方面来说,C和Java的同化降低了程序员同时掌握这两种语言的难度,或者说降低了同时使用它们时出错的可能性。从消极的方面来说,这减小了程序员进行选择的空间;试想一下,如果最终C和Java成了一样的语言(可能只剩下语法的细节差异),那么程序员就不用选择了。在这里我要声明:我很喜欢Java,但是不希望C变成Java。我希望C和Java
保持一定的距离,保持各自特有的优点,以便在不同场合选用。一般情况下,在希望得到最佳性能时C是最合适的,这主要是由于C直接使用指针;在希望得到最好的可移植性时Java是最好的。对于编程来说,C++和Java之间的主要差异就在于对指针的使用。近年来,由于Java的流行,指针大受非议,但是在有些场合指针确实很方便;而且对于指针不安全等问题,C++并不是没有解决方案,“收益越大,风险越高”是很自然的,我认为不应该“因噎废食”。
如果C语言完全放弃指针,实在是可惜,幸好C#只是限制了指针的使用。Microsoft这么做的原因是很值得思考的,它们可能也不舍得放弃指针,但是又要向Java风气做妥协。
好了,我说得太多了,这些只是我的个人意见。作为有经验的程序员,你一定会有自己的看法和好恶。和以往一样,每当出现一种新语言时,我们只能研究它,决定是否采用它,至于它应该如何如何我们是无权决定的。只要我们能够利用它的长处编写出更好的程序,或者更快地编写出程序就可以了。衷心希望你能够通过本书掌握C#,利用它编写出精品程序,同时享受编程的乐趣。
本书主要由马朝晖、陈美红翻译,参与翻译、录入、审校的还有刘丽珍、王建芬、杨帆、邹辉、潘浩、楼涵、董小蕾、王悦、李军、罗伟、鲍广华、瞿兰、陆明、宋丽、杨立军、李鸣、马晓云、成荣光等。
此,如果你同时掌握Java和C++,那么当你看到某些C#功能时你会情不自禁地说:“这太Java了。”所以,我甚至可以建议:如果你只具有C++背景,那么不妨先学习Java,再回头学习C#。
好在,我几年前已经从C++转向了Java,所以我觉得学习C#并不难。但是我想C++程序员会很不习惯,因此我自作主张将书中提到的C#与C++的差异收集起来,供C++程序员参考(见下表);其中主要列出了改变的地方,增加的功能总结得不全。这些改变的影响各有不同,有的非常好,有的可能会造成麻烦,有的可以不用理会;我想你有能力判断各种改变的影响属于什么性质。但是,增加的功能基本上都很出色。
Microsoft在C#中所做的主要改进在以下几个方面:
·首先是增强了C语言面向对象的程度。C++在近几年似乎丧失了“面向对象”的荣誉,而降成了“基于对象的”。的确,C#在这方面大有改进。单根的对象层次结构,所有对象都最终派生自System.Object,取消了全局方法,等等;这些都提高了面向对象的程度。
·提高代码的优雅程度。准确地说,主要是提高客户代码的优雅程度。第5章开头说的话非常正确,“系统被简化到一定程度之后,进一步简化的惟一方法就是转移复杂性,将最复杂的工作转移到适合处理它的部分中去。”对于语言来说,就是让类的编写者付起更大的责任,让类的客户更轻松。优雅指的是采用自然而且简便的方式。像特性这样的功能确实很优雅。当然,转移复杂性并不能减小复杂性,客户轻松了,类的编写者就费劲了。但这种原则是正确的,毕竟,最了解类的人是类的编写者。在崇尚可重用性的今天,迫使客户详细研究类,还要记住一堆特殊规则,对于重用是很不利的。
力求优雅和自然,这可能是C#给我的最大启示了,我们在自己的程序设计工作中应该时刻想着客户。’打个比方,你要是买了一台电视机,你肯定不愿意查看它的电路图,
然后拿起螺丝刀(甚至是电烙铁)在机器里折腾一小时后才能看电视。你希望插上电源和天线,一按遥控器就行了,而且希望遥控器按钮的功能一目了然。这就是自然。
·提供了.NET语言之间的互操作性。这主要是通过MSIL和通用类型系统实现的。MSIL借用了Java字节代码的中间语言概念,但仅仅是借用了概念,它还是局限于Windows的范围。而通用类型系统算是一个成果,而不是成就;既然Microsoft控制着VC、VB等语言,那么这些语言的数据类型不能完全兼容是很荒谬的,现在Microsoft做了早就应该做的事。
这本书的原文中许多地方非常晦涩,用的词汇也常常很偏,翻译起来很难,我们用了很长时间才完成翻译工作。我们在翻译过程中不得不进行了一定程度的意译,我们确信已经尽力保持了原文的意思,而且纠正了原书的一些明显错误。如果你有幸得到本书的原文,希望你不要纯粹从字面评价本译稿(这对程序员是没有意义的)。当然,因为我们的水平有限,而且不可能保证没有疏漏,所以欢迎你指出书中的实质性错误。由于原文比较晦涩,加之我们的语言水平有限,译稿可能不够流畅,请见谅。
原文虽然难读,但是作者的某些见解还是很精彩的。比如,作者指出goto语句并不是毫无可取之处,这的确很有道理。我和大家一样在学习编程的时候,就被告之要避免使用goto语句,这已经形成了一种教条。我也习惯了不使用goto语句,这往往是因为有些语言取消了goto语句;即使语言支持goto语句,我也不用它,这可能是因为怕别人嘲笑我无知。我说这么多,
并不是想说goto语句是多么必要,而是感到很佩服作者挑战教条的勇气。作为程序员,我们不但应该掌握进行创造性工作的技能,而且应该具有相应的勇气。
另外,本书中使用的术语没有完全按照.NET中文版的译法,因为我们认为其中的一些译法并不合适。比如assembly,.NET中文版译为“程序集”,这个译文实在太模糊,太松散了,所以我们使用“配件”这个词。对于新术语,我们参考了.NET中文版、技术网站和讨论组中的译法,经过讨论之后确定译法(我们做决定的标准在很大程度上也是“是否自然”)。也许你所习惯的译文与我们的不同,但是我们希望这些不一致的地方不会影响你阅读本书;毕竟,作为一个有实力学习技术内幕类书籍的程序员,你所关注的肯定不是文字,而是文字的含义。
公平地说,C#对C++进行了很多很有价值的改进,是一门值得学习的语言。但是,有些地方确实值得商榷。比如,对象赋值的效果对于C++程序员是很难习惯的,而且C++原来的方式并不太差(至少提供了选择方案)。
C语言系列的这种发展方向是否是好现象?答案肯定是见仁见智的。可以肯定的是,这种发展至少在一定程度上是正确的,因为Java确实具有C所缺乏的一些特质。问题只是这种同化的程度。从好的方面来说,C和Java的同化降低了程序员同时掌握这两种语言的难度,或者说降低了同时使用它们时出错的可能性。从消极的方面来说,这减小了程序员进行选择的空间;试想一下,如果最终C和Java成了一样的语言(可能只剩下语法的细节差异),那么程序员就不用选择了。在这里我要声明:我很喜欢Java,但是不希望C变成Java。我希望C和Java
保持一定的距离,保持各自特有的优点,以便在不同场合选用。一般情况下,在希望得到最佳性能时C是最合适的,这主要是由于C直接使用指针;在希望得到最好的可移植性时Java是最好的。对于编程来说,C++和Java之间的主要差异就在于对指针的使用。近年来,由于Java的流行,指针大受非议,但是在有些场合指针确实很方便;而且对于指针不安全等问题,C++并不是没有解决方案,“收益越大,风险越高”是很自然的,我认为不应该“因噎废食”。
如果C语言完全放弃指针,实在是可惜,幸好C#只是限制了指针的使用。Microsoft这么做的原因是很值得思考的,它们可能也不舍得放弃指针,但是又要向Java风气做妥协。
好了,我说得太多了,这些只是我的个人意见。作为有经验的程序员,你一定会有自己的看法和好恶。和以往一样,每当出现一种新语言时,我们只能研究它,决定是否采用它,至于它应该如何如何我们是无权决定的。只要我们能够利用它的长处编写出更好的程序,或者更快地编写出程序就可以了。衷心希望你能够通过本书掌握C#,利用它编写出精品程序,同时享受编程的乐趣。
本书主要由马朝晖、陈美红翻译,参与翻译、录入、审校的还有刘丽珍、王建芬、杨帆、邹辉、潘浩、楼涵、董小蕾、王悦、李军、罗伟、鲍广华、瞿兰、陆明、宋丽、杨立军、李鸣、马晓云、成荣光等。
前言回到顶部↑
为什么要写这本书
20年来,我为各种平台开发软件(从System/38,到AS/400,到OS/2和现在的Microsoft Windows),我可以毫无保留地说我已经完成了使命。向往夜晚和周末的日子成了遥远的记忆;
这种向往并不是因为我想回家,而是因为在家可以毫无干扰地整日整夜工作。我感到所有值得做的事都已经完成了。这种感觉在2000年初发生了变化。
2000年,就在Microsoft在佛罗里达州奥兰多发布.NET之前的几个月,我的一位好朋友告诉我一个关于很“酷”的C#语言和运行时环境框架(名为NGWS)的秘密。尽管他谈论这个话题时充满了热情,但是我并不以为然,我回想起了那些失败的总体体系结构(比如IBM的SAA和Microsoft的DNA)。结果,我抱着怀疑的态度开始接触C#和.NET。
但是随着我逐渐了解了这种新语言和平台,我原来的热情逐渐回来了。近两年,我起床时不再带着对重复编写烦人的应用程序的恐惧,而是满心期望学习.NET的令人兴奋的新功能,而且我现在仍然在学习。实际上,我学到的关于.NET的所有新东西都打开了我的眼界。
这听起来不可思议,但是大多数程序员开始编程并不是为了钱,而只是为了学习和建立某些东西所带来的成就感和满足感。对于我来说,C#和.NET框架使我找回了已经失去的热情。
所以,我写这本书是为了与你分享我重新编程所感到的乐趣。我希望你在阅读本书并开始使用C#时同样感到愉快和兴奋。
本书的这个版本有什么新东西
如果你读过本书的第一版(谢谢!),你可能会奇怪这一版为什么厚了一倍。这是因为我写第一版的时间比较早。在.NET和C#刚发布之后的一段时期,写这方面的书的作者几乎都是在边学习边写作。而且与任何软件工程一样,你每学一点儿东西,就希望马上实践它。很明显,这对于书是不现实的,所以我知道需要编写第二版来使本书更完整。下面是对这一版的新内容的概述。我想你阅读完以下内容后就会理解我为什么这么渴望编写这一版了。
·大量的新资料,包括新添加的章节 读者对第一版提供了大量反馈意见,包括他们自己对C#语言的各个方面的体会,以及建议应该更深入地讨论哪些语言功能。作为对这些反馈的回应,我们重新审视了最常被问到的一些语言和框架功能,而且特意增强了本书对这些主题的讨论。许多章节经历了较大的修改,而且许多新添加的章节讨论了第一版没有涉及的问题。例如,应读者的请求,新添加的“安全”一章讨论了许多安全问题,包括代码访问安全、基于角色的安全、可检验的类型安全、代码签名、加密/数据签名和隔离存储。其他新添加的章包括“字符串处理和正则表达式”、“用流进行文件I/O"、“数值处理和Math类”、“集合和对象枚举”(我最喜欢的一章)、“固定和内存管理”、“从C#应用程序使用COM”和“在非托管代码中使用.NET组件”。另外, “使用XML进行文档记录”这个新章讨论了从C#源代码注释产生XML文档的能力。
·本书是一本真正的“技术内幕” 第二版最主要的目标是成为更加名副其实的“技术内幕”。我在第一版中犯的错误是,我只有在了解到MSIL可能影响我们使用C#编写代码的方式时才进入MSIL层。但是,许多读者很快指出,我们这些程序员都是很好奇的人,有时候我们希望了解某些东西只是因为我们不了解它们。在这一版的几乎每一章中,我都是先解释主题,然后深入研究编译器产生的MSIL。如果你花点儿时间研究幕后的情况,你会为某些功能的实现方式感到吃惊(至少我很吃惊)。另外,章节的组织方式使得不关心底层MSIL的人可以轻易跳过MSIL部分。另一方面,已经了解某个功能的语法并且知道如何使用它的人不必阅读相关的解释,而是可以直接跳到讨论底层MSIL的部分。
·“为什么”以及“如何” 许多书详细说明了使用语言功能所需的语法,然后给出一系列例子。但是你我可以从联机帮助中得到语法说明。我认为一本书提供的应该不止这些。因此,在每一章中我都试图解释给定的语言功能为什么存在,以及设计它是为了解决代码中的什么问题。毕竟,如果你从来没有使用过某种功能(比如接口或委托),那么不解释为什么需要使用它而只给出语法的话,你就无法充分利用它。
.更好且更现实的例子 我个人喜欢比foo/bar型例子更现实的例子,但是在第一版的示例应用程序中只有大约10%算得上是现实的例子。在本书中,这个比例是大约70%。例如,在第13章中提供了大量例子。前两个例子(操作符重载)讲解如何重载加法(+)操作符来对发票对象进行总计。另一个演示程序讲解如何重载几个操作符来创建一个便于产生渐变填充值的RGB类。然后,转换演示程序讲解如何转换各种温度制对象以及如何创建和使用一个三态控件。这些类不是完整的实现,但是我认为向程序员提供现实的演示程序有助于他们理解在应用程序中何处以及如何使用给定的功能。
谁应该阅读本书
本书的内容已经进行了较大的更新,添加了许多中高级信息,同时在组织各章内容时尽量使不熟悉C#的开发人员也能够理解这些主题。各章往往先解释C#或.NET的某个功能、语言中为什么需要这个功能以及它解决的问题。然后,提供一个与此功能相关的简单的演示应用程序,接着解释所需的语法。在讨论了这个主题的基础知识之后,提供一些比较高级的演示程序和资料,比如编译器产生的MSIL。因此,本书既适合C#和.NET的初学者,也适合已经使用过C#语言进行编程并且希望学习更高级的语言功能的开发人员。
对本书读者惟一的要求是,你们应该知道如何使用C、C++或Java编写简单的程序。另一个先决条件是你希望学习和研究使用C#语言编写应用程序的新技能。当然了,既然你手里拿着这本书,你显然是有这种愿望的。
本书的组织结构
本书被仔细地组织为三个在逻辑上相关的部分:每个部分由几章组成,每一章分别讨论C#或.NET开发的一个方面。
第一部分:C#类基本原理
在第一部分中,我们提供了使用C#定义和使用类和基本类成员的基础知识。但是,因为我的一个主要目标是提供非常实在的内容,所以我们没有谈论Microsoft的想法或我为什么认为.NET很出色等话题。程序员希望看到代码,而不是听我们大发议论。第1章直接带领你开始编写应用程序、编译库(DLL)和.NET模块以及创建多文件配件。你甚至将学习如何查看全局配件缓存并且使用ILDASM工具查看编译器产生的配件代码(MSIL)。第2章简单地概述了通用类型系统,第3章和第4章讲解C#类和结构定义的基础知识,以及如何定义和调用方法。这几章和书中其他章一样采用先易后难的组织形式,最后你会学到常量和只读字段的差异、类型初始化器的用途以及如何使用new和override关键字重定义虚拟方法。
20年来,我为各种平台开发软件(从System/38,到AS/400,到OS/2和现在的Microsoft Windows),我可以毫无保留地说我已经完成了使命。向往夜晚和周末的日子成了遥远的记忆;
这种向往并不是因为我想回家,而是因为在家可以毫无干扰地整日整夜工作。我感到所有值得做的事都已经完成了。这种感觉在2000年初发生了变化。
2000年,就在Microsoft在佛罗里达州奥兰多发布.NET之前的几个月,我的一位好朋友告诉我一个关于很“酷”的C#语言和运行时环境框架(名为NGWS)的秘密。尽管他谈论这个话题时充满了热情,但是我并不以为然,我回想起了那些失败的总体体系结构(比如IBM的SAA和Microsoft的DNA)。结果,我抱着怀疑的态度开始接触C#和.NET。
但是随着我逐渐了解了这种新语言和平台,我原来的热情逐渐回来了。近两年,我起床时不再带着对重复编写烦人的应用程序的恐惧,而是满心期望学习.NET的令人兴奋的新功能,而且我现在仍然在学习。实际上,我学到的关于.NET的所有新东西都打开了我的眼界。
这听起来不可思议,但是大多数程序员开始编程并不是为了钱,而只是为了学习和建立某些东西所带来的成就感和满足感。对于我来说,C#和.NET框架使我找回了已经失去的热情。
所以,我写这本书是为了与你分享我重新编程所感到的乐趣。我希望你在阅读本书并开始使用C#时同样感到愉快和兴奋。
本书的这个版本有什么新东西
如果你读过本书的第一版(谢谢!),你可能会奇怪这一版为什么厚了一倍。这是因为我写第一版的时间比较早。在.NET和C#刚发布之后的一段时期,写这方面的书的作者几乎都是在边学习边写作。而且与任何软件工程一样,你每学一点儿东西,就希望马上实践它。很明显,这对于书是不现实的,所以我知道需要编写第二版来使本书更完整。下面是对这一版的新内容的概述。我想你阅读完以下内容后就会理解我为什么这么渴望编写这一版了。
·大量的新资料,包括新添加的章节 读者对第一版提供了大量反馈意见,包括他们自己对C#语言的各个方面的体会,以及建议应该更深入地讨论哪些语言功能。作为对这些反馈的回应,我们重新审视了最常被问到的一些语言和框架功能,而且特意增强了本书对这些主题的讨论。许多章节经历了较大的修改,而且许多新添加的章节讨论了第一版没有涉及的问题。例如,应读者的请求,新添加的“安全”一章讨论了许多安全问题,包括代码访问安全、基于角色的安全、可检验的类型安全、代码签名、加密/数据签名和隔离存储。其他新添加的章包括“字符串处理和正则表达式”、“用流进行文件I/O"、“数值处理和Math类”、“集合和对象枚举”(我最喜欢的一章)、“固定和内存管理”、“从C#应用程序使用COM”和“在非托管代码中使用.NET组件”。另外, “使用XML进行文档记录”这个新章讨论了从C#源代码注释产生XML文档的能力。
·本书是一本真正的“技术内幕” 第二版最主要的目标是成为更加名副其实的“技术内幕”。我在第一版中犯的错误是,我只有在了解到MSIL可能影响我们使用C#编写代码的方式时才进入MSIL层。但是,许多读者很快指出,我们这些程序员都是很好奇的人,有时候我们希望了解某些东西只是因为我们不了解它们。在这一版的几乎每一章中,我都是先解释主题,然后深入研究编译器产生的MSIL。如果你花点儿时间研究幕后的情况,你会为某些功能的实现方式感到吃惊(至少我很吃惊)。另外,章节的组织方式使得不关心底层MSIL的人可以轻易跳过MSIL部分。另一方面,已经了解某个功能的语法并且知道如何使用它的人不必阅读相关的解释,而是可以直接跳到讨论底层MSIL的部分。
·“为什么”以及“如何” 许多书详细说明了使用语言功能所需的语法,然后给出一系列例子。但是你我可以从联机帮助中得到语法说明。我认为一本书提供的应该不止这些。因此,在每一章中我都试图解释给定的语言功能为什么存在,以及设计它是为了解决代码中的什么问题。毕竟,如果你从来没有使用过某种功能(比如接口或委托),那么不解释为什么需要使用它而只给出语法的话,你就无法充分利用它。
.更好且更现实的例子 我个人喜欢比foo/bar型例子更现实的例子,但是在第一版的示例应用程序中只有大约10%算得上是现实的例子。在本书中,这个比例是大约70%。例如,在第13章中提供了大量例子。前两个例子(操作符重载)讲解如何重载加法(+)操作符来对发票对象进行总计。另一个演示程序讲解如何重载几个操作符来创建一个便于产生渐变填充值的RGB类。然后,转换演示程序讲解如何转换各种温度制对象以及如何创建和使用一个三态控件。这些类不是完整的实现,但是我认为向程序员提供现实的演示程序有助于他们理解在应用程序中何处以及如何使用给定的功能。
谁应该阅读本书
本书的内容已经进行了较大的更新,添加了许多中高级信息,同时在组织各章内容时尽量使不熟悉C#的开发人员也能够理解这些主题。各章往往先解释C#或.NET的某个功能、语言中为什么需要这个功能以及它解决的问题。然后,提供一个与此功能相关的简单的演示应用程序,接着解释所需的语法。在讨论了这个主题的基础知识之后,提供一些比较高级的演示程序和资料,比如编译器产生的MSIL。因此,本书既适合C#和.NET的初学者,也适合已经使用过C#语言进行编程并且希望学习更高级的语言功能的开发人员。
对本书读者惟一的要求是,你们应该知道如何使用C、C++或Java编写简单的程序。另一个先决条件是你希望学习和研究使用C#语言编写应用程序的新技能。当然了,既然你手里拿着这本书,你显然是有这种愿望的。
本书的组织结构
本书被仔细地组织为三个在逻辑上相关的部分:每个部分由几章组成,每一章分别讨论C#或.NET开发的一个方面。
第一部分:C#类基本原理
在第一部分中,我们提供了使用C#定义和使用类和基本类成员的基础知识。但是,因为我的一个主要目标是提供非常实在的内容,所以我们没有谈论Microsoft的想法或我为什么认为.NET很出色等话题。程序员希望看到代码,而不是听我们大发议论。第1章直接带领你开始编写应用程序、编译库(DLL)和.NET模块以及创建多文件配件。你甚至将学习如何查看全局配件缓存并且使用ILDASM工具查看编译器产生的配件代码(MSIL)。第2章简单地概述了通用类型系统,第3章和第4章讲解C#类和结构定义的基础知识,以及如何定义和调用方法。这几章和书中其他章一样采用先易后难的组织形式,最后你会学到常量和只读字段的差异、类型初始化器的用途以及如何使用new和override关键字重定义虚拟方法。
序言回到顶部↑
我在Microsoft的全部工作就是致力于改进开发人员的工作方式,特别是提高开发人员的生产效率。我的工作涉及许多产品和技术,但是我从来没有像现在这样因为所做的工作大大改进了开发人员的工作方式而极度兴奋。Microsoft.NET提供的技术其广度和深度是令人吃惊的。我们提供了一种非常新颖的语言,打破了过去将开发人员隔离在各种语言范围内的壁垒,而且使Web站点能够满足用户的需求。这几点都很有趣,然而把它们结合起来才真正令人兴奋。
我们来看看.NET的关键构件和一些相关的技术:
·C#,一种新语言 C#是C和C++语言系列中第一种面向组件的语言。它是一种从C和C++发展出来的简单、现代、面向对象以及类型安全的编程语言。C#结合了Microsoft Visual Basic的高生产率和C++的底层能力。
·通用语言运行时环境 高性能的通用语言运行时环境包含一个执行引擎、一个垃圾收集器、即时编译机制、一个安全系统和内容丰富的类框架(.NET框架)。运行时环境是以支持多种语言为目标而重新设计的。
·通用语言规范 通用语言规范(CLS)定义了一组共有的语言功能。CIS规定的限制非常少,这有助于建立一系列与CIS兼容的语言。这些语言具有双重好处:对.NET框架功能的完全访问以及与其他兼容语言之间丰富的互操作能力。例如,Visual Basic可以继承C#类并且重定义它的虚拟方法。
·多种可以利用运行时环境的语言 Microsoft提供的可以利用运行时环境的语言包括Visual Basic、具有托管扩展的Visual C++、Visual C#和JScript。第三方开发商还提供了许多其他语言。
.Web服务 当今的WWW主要由单独的网站组成。用户可能需要访问多个网站才能完成某个任务,比如安排一个旅行团的旅行方案,而这些网站通常没有进行协作。下一代Web将由相互协作的Web站点的网络组成。原因很简单:相互协作的Web站点更能满足用户的需求。Microsoft的Web服务技术支持通过基于XML的标准协议(这些协议既独立于语言,也独立于平台)进行通信,这可以促进Web站点之间的协作。许多重要的Web服务将基于C#和在Windows上运行的通用语言运行时环境,但是这个体系结构是开放的。
·Visual Studio.NET Visual Studio.NET将以上所有构件有机地结合在一起,它简化了使用各种编程语言编写组件、应用程序和服务的过程。
既然我已经谈到了与C#相关的一些重要技术,现在就来谈谈C#本身。开发人员在所使用的语言上已经花费了大量精力,所以一种新语言要证明它是值得开发人员学习和使用的,则应该保留了开发人员常用的一些功能,并且进行了一定的改进和革新。
保留功能
Hippocrates(古希腊医学家,被尊称为“医学之父”。——译者注)说:“习惯有两种作用:
提供帮助,或者至少不带来损害。”我们在设计C#时充分考虑到了“不带来损害”的原则。如果一个C或C++功能出色地解决了一个问题,我们就原封不动地保留它。最重要的是,C#从C和C++那里借用了一些核心功能,比如表达式、语句和总体语法。因为典型的程序主要是由这些功能组成的,所以C和C++开发人员会立即适应C#。
改进
C#进行了许多改进,改进的地方太多了,无法在这篇简短的序言中一一列举;但是有几个可以消除常见且浪费时间的C和C++错误的修改应该提一下:
·变量在使用之前必须被初始化,所以消除了由未初始化变量导致的错误。
·if和while这样的语句要求使用布尔值,所以如果开发人员偶然使用赋值操作符(二)
·替代相等操作符(==),那么他会在编译时发现这个错误。
·不允许在switch语句中进行穿透,所以如果开发人员偶然漏掉了break语句,那么他会在编译时发现这个错误。
革新
在C#的类型系统中进行了几个重大的革新,包括以下几点:
我们来看看.NET的关键构件和一些相关的技术:
·C#,一种新语言 C#是C和C++语言系列中第一种面向组件的语言。它是一种从C和C++发展出来的简单、现代、面向对象以及类型安全的编程语言。C#结合了Microsoft Visual Basic的高生产率和C++的底层能力。
·通用语言运行时环境 高性能的通用语言运行时环境包含一个执行引擎、一个垃圾收集器、即时编译机制、一个安全系统和内容丰富的类框架(.NET框架)。运行时环境是以支持多种语言为目标而重新设计的。
·通用语言规范 通用语言规范(CLS)定义了一组共有的语言功能。CIS规定的限制非常少,这有助于建立一系列与CIS兼容的语言。这些语言具有双重好处:对.NET框架功能的完全访问以及与其他兼容语言之间丰富的互操作能力。例如,Visual Basic可以继承C#类并且重定义它的虚拟方法。
·多种可以利用运行时环境的语言 Microsoft提供的可以利用运行时环境的语言包括Visual Basic、具有托管扩展的Visual C++、Visual C#和JScript。第三方开发商还提供了许多其他语言。
.Web服务 当今的WWW主要由单独的网站组成。用户可能需要访问多个网站才能完成某个任务,比如安排一个旅行团的旅行方案,而这些网站通常没有进行协作。下一代Web将由相互协作的Web站点的网络组成。原因很简单:相互协作的Web站点更能满足用户的需求。Microsoft的Web服务技术支持通过基于XML的标准协议(这些协议既独立于语言,也独立于平台)进行通信,这可以促进Web站点之间的协作。许多重要的Web服务将基于C#和在Windows上运行的通用语言运行时环境,但是这个体系结构是开放的。
·Visual Studio.NET Visual Studio.NET将以上所有构件有机地结合在一起,它简化了使用各种编程语言编写组件、应用程序和服务的过程。
既然我已经谈到了与C#相关的一些重要技术,现在就来谈谈C#本身。开发人员在所使用的语言上已经花费了大量精力,所以一种新语言要证明它是值得开发人员学习和使用的,则应该保留了开发人员常用的一些功能,并且进行了一定的改进和革新。
保留功能
Hippocrates(古希腊医学家,被尊称为“医学之父”。——译者注)说:“习惯有两种作用:
提供帮助,或者至少不带来损害。”我们在设计C#时充分考虑到了“不带来损害”的原则。如果一个C或C++功能出色地解决了一个问题,我们就原封不动地保留它。最重要的是,C#从C和C++那里借用了一些核心功能,比如表达式、语句和总体语法。因为典型的程序主要是由这些功能组成的,所以C和C++开发人员会立即适应C#。
改进
C#进行了许多改进,改进的地方太多了,无法在这篇简短的序言中一一列举;但是有几个可以消除常见且浪费时间的C和C++错误的修改应该提一下:
·变量在使用之前必须被初始化,所以消除了由未初始化变量导致的错误。
·if和while这样的语句要求使用布尔值,所以如果开发人员偶然使用赋值操作符(二)
·替代相等操作符(==),那么他会在编译时发现这个错误。
·不允许在switch语句中进行穿透,所以如果开发人员偶然漏掉了break语句,那么他会在编译时发现这个错误。
革新
在C#的类型系统中进行了几个重大的革新,包括以下几点:







点击看大图





加载中...

