在软件工程的发展历史中,用于编写计算机程序的方法经历了几次思维模式的重大转变。每种思维模式都以前一种为基础,宗旨都是增强代码的组织,并降低复杂性。本书将带领你体验相同的思维模式转变过程。
本书开始几章会指导你学习顺序编程结构。在这种编程结构中,语句按编写顺序执行。该结构的问题在于,随着需求的增加,复杂性也指数级增加。为降低复杂性,将代码块转变成方法,产生了结构化编程模型。在这种模型中,可以从一个程序中的多个位置调用同一个代码块,不需要复制。但即使有这种结构,程序还是会很快变得臃肿不堪,需进一步抽象。所以,在此基础上人们又提出了面向对象编程的概念,这将在第6章开始讨论。在此之后,你将继续学习其他编程方法,比如基于接口的编程和LINQ(以及它促使集合API发生的改变),并□终学习通过特性(attribute)进行初级的声明性编程(□□8章)。
本书有以下三个主要职能。
全面讲述C#语言,其内容已远远超过了一本简单的教程,为你进行高效率软件开发打下坚实基础。
对于已熟悉C#的读者,本书探讨了一些较为复杂的编程思想,并深入讨论了语言□新版本(C# 7.0和.NET Framework 4.7/.NET Core 2.0)的新功能。
它是你永远的案头参考—即便在你精通了这种语言之后。
成功学习C#的关键在于,要尽可能快地开始编程。不要等自己成为一名理论“专家”之后才开始写代码。所以不要犹豫,马上开始写程序吧。作为迭代开发思想的追随者,我希望即使一名刚开始学习编程的新手,在第2章结束时也能动手写基本的C#代码。
许多主题本书没有讨论。你在本书中找不到ASP.NET、ADO.NET、Xamarin、智能客户端开发以及分布式编程等主题。虽然这些主题与.NET有关,但它们都值得用专门的书分专题讲述。幸好市面上已经有丰富的图书供读者选择。本书重点在于C#及基类库中的类型。读完本书之后,你在上述任何领域继续深入学习都会有游刃有余的感觉。
本书面向的读者
写作本书时,我面临的一个挑战是如何在持续吸引高级开发人员眼球的同时,不因使用assembly、link、chain、thread和fusion等字眼而打击初学者的信心,否则许多人会以为这是一本讲冶金而不是程序设计的书。本书的主要读者是已经有一定编程经验,并想多学一种语言来“傍身”的开发者。但我还是小心地编排了本书的内容,使之对各种层次的开发者都有足够大的价值。
初学者:假如你是编程新手,本书将帮助你从入门级程序员过渡为C#开发者,消除以后在面临任何C#编程任务时的害怕心理。本书不仅要教会你语法,还要教你养成良好的编程习惯,为将来的编程生涯打下良好基础。
熟悉结构化编程的程序员:学习外语□好的方法就是“沉浸法”。类似地,学习一门计算机语言□好的方法就是在动手中学习,而不是等熟知了它的所有“理论”之后再动手。基于这个前提,本书□开始的内容是那些熟悉结构化编程的开发者很容易上手的。到第5章结束时,这些开发者应该可以开始写基本的控制流程序。然而,要成为真正的C#开发者,记住语法只是□□步。为了从简单程序过渡到企业级开发,C#开发者必须熟练从对象及其关系的角度来思考问题。为此,第6章的“初学者主题”开始介绍类和面向对象开发。历史上的C、COBOL和FORTRAN等结构化编程语言虽然仍在发挥作用,但作用会越来越小,所以,软件工程师们应该逐渐开始了解面向对象开发。C#是进行这一思维模式转变的理想语言,因为它本来就是基于“面向对象开发”这一中心思想来设计的。
熟悉“基于对象”和“面向对象”理念的开发者:C++、Python、TypeScript、Visual Basic和Java程序员都可归于此类。对于分号和大括号,他们可是一点儿都不陌生!简单浏览一下□□章的代码,你会发现,从核心上讲,C#类似于你熟知的C和C++风格的语言。
C#专家:对于已经精通C#的读者,本书可供你参考不太常见的语法。此外,对于在其他地方强调较少的一些语言细节以及微妙之处,我提出了自己的见解。□重要的是,本书提供了编写可靠和易维护代码的指导原则及模式。在你教别人学C#时,本书也颇有助益。从C# 3.0到C# 7.0□重要的一些增强包括:
字符串插值(第2章)
隐式类型的变量(第3章)
元组(第3章)
模式匹配(第4章)
扩展方法(第6章)
分部方法(第6章)
泛型(□□2章)
Lambda语句和表达式(□□3章)
表达式树(□□3章)
匿名类型(□□5章)
标准查询操作符(□□5章)
查询表达式(□□6章)
动态编程(□□8章)
用任务编程库(TPL)和async进行多线程编程(□□9章)
用PLINQ进行并行查询处理(□□9章)
并发集合(第20章)
考虑到许多人还不熟悉这些主题,本书围绕它们展开了详细的讨论。涉及高级C#开发的还有“指针”这一主题,该主题将在第21章讨论。即使是有经验的C#开发者,也未必能很透彻地理解这一主题。
本书特色
本书是语言参考书,遵循核心《C#语言7.0规范》(C# Language 7.0 Specification)。为了帮助读者理解各种C#构造,书中用大量例子演示了每一种特性,而且为每个概念都提供了相应的指导原则和□佳实践,以确保代码能顺利编译,避免留下隐患,并获得□佳的可维护性。
为增强可读性,所有代码均进行了特殊格式处理,而且每章内容都用思维导图来概括。
C#设计规范
本书新版本□重大的改进之一就是增加了大量“设计规范”,下面是取自□□7章的例子。
设计规范
要确保相等的对象有相等的哈希码。
要确保对象在哈希表中时哈希码永不变化。
要确保哈希算法快速生成良好分布的哈希码。
要确保哈希算法在任何可能的对象状态中的健壮性。
区分知道语法的程序员和能因地制宜写出□高效代码的专家的关键就是这些设计规范。专家不仅能让代码通过编译,还会遵循□佳实践,降低出现bug的概率,并使代码的维护变得更容易。设计规范强调了一些关键原则,开发时务必注意。
示例代码
本书大多数代码都能在公共语言基础结构(Common Language Infrastructure,CLI)的任何实现上运行,但重点还是Microsoft .NET Framework和.NET Core这两个实现。很少使用平台或厂商特有的库,除非需要解释只和那些平台相关的重要概念(例如,解释如何正确处理Windows单线程UI)。
下面是一个示例代码清单。
代码清单1.19 注释代码
下面解释具体的格式:
注释使用斜体。
关键字加粗。
有的代码突出显示,是为了指出这些代码与之前的有区别,或是为了演示正文介绍的概念。
突出显示的可能是一整行,也可能是一行中的几个字符。
省略号表示无关代码已省略。
代码清单后列出了对应的控制台输出。由用户输入的内容加粗。
输出1.7
虽然我也可以在书中提供完整代码以方便复制,但这样会分散大家的注意力。因此,你需要在自己的程序中修改示例代码。书中的代码主要省略了错误检查,比如异常处理。另外,代码没有显式包含using System语句,所有例子都需要该语句。
请访问https://github.com/IntelliTect/EssentialCSharp或http://bookzhou.com下载示例代码。
思维导图
每章开头都有一幅“思维导图”作为提纲,目的是为读者提供针对每章内容的快速参考。下面是一个例子(摘自第6章)。
每章主题显示在思维导图的中心,高级主题围绕中心展开。利用思维导图,读者可方便地搭建自己的知识体系,可以从一个主题出发,更清楚地理解其周边的各个具体概念,避免中途纠缠于一些不相干的枝节问题。
分类解说
根据编程水平的不同,可以利用书中的标志来帮助自己轻松找到适合自己的内容。
初学者主题:特别针对入门级程序员提供的定义或解释。
高级主题:可以让有经验的开发者将注意力放在他们□关心的内容上。
标注:用有底纹的标注框强调关键点,引起读者的注意。
语言对比:分散在正文中的补充内容描述了C#和其他语言的关键差异,为熟悉其他语言的读者提供指引。
本书内容组织
总体来说,软件工程的宗旨就是管理复杂性。本书基于该宗旨来组织内容。□□章~第5章介绍结构化编程,学习这些内容后,可以立即开始写一些功能简单的代码。第6章~□□0章介绍C#的面向对象构造,新手应在完全理解这几章的内容之后,再开始接触本书其余部分更高级的主题。□□2章~□□4章介绍更多用于降低复杂性的构造,讲解当今几乎所有程序都要用到的通用设计模式。理解了它们之后,才可以更轻松地理解如何通过反射和特性来进行动态编程。后续章节将广泛运用它们来实现线程处理和互操作性。
本书□后专门用一章(第22章)讲解CLI。这一章在开发平台的背景下对C#语言进行了描述。之所以要放到□后,是因为它非C#特有,且不涉及语法和编程风格问题。不过,本章适合在任何时候阅读,或许□恰当的时机是在阅读完□□章之后。
下面是每一章的内容提要。(加黑的标题表明那一章含有C# 6.0和C# 7.0的内容。)
□□章—C#概述:本章在展示了用C#写的HelloWorld程序之后对其进行细致分析。目的是让读者熟悉C#程序的“外观和感觉”,并理解如何编译和调试自己的程序。另外,还简单描述了执行C#程序的上下文及其中间语言(Intermediate Language,IL)。
第2章—数据类型:任何有用的程序都要处理数据,本章介绍了C#的基元数据类型。
第3章—更多数据类型:本章深入讲解数据类型的两大类别:值类型和引用类型。然后讲解了可空修饰符以及C# 7.0引入的元组。□后深入讨论了基元数组结构。
第4章—操作符和控制流:计算机□擅长重复性操作,为利用该能力,需知道如何在程序中添加循环和条件逻辑。本章还讨论了C#操作符、数据转换和预处理器指令。
第5章—方法和参数:本章讨论了方法及其参数的细节,其中包括通过参数来传值、传引用和通过out参数返回数据。C# 4.0新增了默认参数,本章将解释如何使用。
第6章—类:前面已学过类的基本构成元素,本章合并这些构造,以获得具有完整功能的类型。类是面向对象技术的核心,它定义了对象模板。
第7章—继承:继承是许多开发者的基本编程手段,C#更是提供了一些独特构造,比如new修饰符。本章讨论了继承语法的细节,其中包括重写(overriding)。
第8章—接口:本章讨论如何利用接口来定义类之间的“可进行版本控制的交互契约”(versionable interaction contract)。C#同时包含显式和隐式接口成员实现,可实现一个额外的封装等级,这是其他大多数语言所不支持的。