首页>参考读物>计算机科学与技术>软件与程序设计

C# 7.0本质论
作者 : [美] 马克·米凯利斯(Mark Michaelis) 著
译者 : 周靖 译
丛书名 : 名家经典系列
出版日期 : 2019-05-10
ISBN : 978-7-111-62568-1
定价 : 199.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 707
开本 : 16
原书名 : Essential C# 7.0
原出版社: Pearson Education Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

作为历年来深受各层次开发人员欢迎的C#权威指南,本书讨论了从C# 3.0到7.0的最重要的C#特性,强调了现代编程模式,可帮助读者编写简洁、强大、健壮、安全和易于维护的C#代码。世界级C#专家Mark Michaelis对语言进行了全面而深入的探讨,提供了对关键C# 7.0增强、C# 7.0和.NET Core/.NET Standard的配合使用以及跨平台编译的专业论述。

图书特色

世界级C#技术专家亲笔撰写,微软公司C#项目经理作序推荐
根据C# 7.0全面更新,通过大量示例演示C#中的重要特性

图书前言

在软件工程的发展历史中,用于编写计算机程序的方法经历了几次思维模式的重大转变。每种思维模式都以前一种为基础,宗旨都是增强代码的组织,并降低复杂性。本书将带领你体验相同的思维模式转变过程。
本书开始几章会指导你学习顺序编程结构。在这种编程结构中,语句按编写顺序执行。该结构的问题在于,随着需求的增加,复杂性也指数级增加。为降低复杂性,将代码块转变成方法,产生了结构化编程模型。在这种模型中,可以从一个程序中的多个位置调用同一个代码块,不需要复制。但即使有这种结构,程序还是会很快变得臃肿不堪,需进一步抽象。所以,在此基础上人们又提出了面向对象编程的概念,这将在第6章开始讨论。在此之后,你将继续学习其他编程方法,比如基于接口的编程和LINQ(以及它促使集合API发生的改变),并最终学习通过特性(attribute)进行初级的声明性编程(第18章)。
本书有以下三个主要职能。
全面讲述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程序员都可归于此类。对于分号和大括号,他们可是一点儿都不陌生!简单浏览一下第1章的代码,你会发现,从核心上讲,C#类似于你熟知的C和C++风格的语言。
C#专家:对于已经精通C#的读者,本书可供你参考不太常见的语法。此外,对于在其他地方强调较少的一些语言细节以及微妙之处,我提出了自己的见解。最重要的是,本书提供了编写可靠和易维护代码的指导原则及模式。在你教别人学C#时,本书也颇有助益。从C# 3.0到C# 7.0最重要的一些增强包括:
字符串插值(第2章)
隐式类型的变量(第3章)
元组(第3章)
模式匹配(第4章)
扩展方法(第6章)
分部方法(第6章)
泛型(第12章)
Lambda语句和表达式(第13章)
表达式树(第13章)
匿名类型(第15章)
标准查询操作符(第15章)
查询表达式(第16章)
动态编程(第18章)
用任务编程库(TPL)和async进行多线程编程(第19章)
用PLINQ进行并行查询处理(第19章)
并发集合(第20章)
考虑到许多人还不熟悉这些主题,本书围绕它们展开了详细的讨论。涉及高级C#开发的还有“指针”这一主题,该主题将在第21章讨论。即使是有经验的C#开发者,也未必能很透彻地理解这一主题。
本书特色
本书是语言参考书,遵循核心《C#语言7.0规范》(C# Language 7.0 Specification)。为了帮助读者理解各种C#构造,书中用大量例子演示了每一种特性,而且为每个概念都提供了相应的指导原则和最佳实践,以确保代码能顺利编译,避免留下隐患,并获得最佳的可维护性。
为增强可读性,所有代码均进行了特殊格式处理,而且每章内容都用思维导图来概括。
C#设计规范
本书新版本最重大的改进之一就是增加了大量“设计规范”,下面是取自第17章的例子。
设计规范
要确保相等的对象有相等的哈希码。
要确保对象在哈希表中时哈希码永不变化。
要确保哈希算法快速生成良好分布的哈希码。
要确保哈希算法在任何可能的对象状态中的健壮性。
区分知道语法的程序员和能因地制宜写出最高效代码的专家的关键就是这些设计规范。专家不仅能让代码通过编译,还会遵循最佳实践,降低出现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#和其他语言的关键差异,为熟悉其他语言的读者提供指引。
本书内容组织
总体来说,软件工程的宗旨就是管理复杂性。本书基于该宗旨来组织内容。第1章~第5章介绍结构化编程,学习这些内容后,可以立即开始写一些功能简单的代码。第6章~第10章介绍C#的面向对象构造,新手应在完全理解这几章的内容之后,再开始接触本书其余部分更高级的主题。第12章~第14章介绍更多用于降低复杂性的构造,讲解当今几乎所有程序都要用到的通用设计模式。理解了它们之后,才可以更轻松地理解如何通过反射和特性来进行动态编程。后续章节将广泛运用它们来实现线程处理和互操作性。
本书最后专门用一章(第22章)讲解CLI。这一章在开发平台的背景下对C#语言进行了描述。之所以要放到最后,是因为它非C#特有,且不涉及语法和编程风格问题。不过,本章适合在任何时候阅读,或许最恰当的时机是在阅读完第1章之后。
下面是每一章的内容提要。(加黑的标题表明那一章含有C# 6.0和C# 7.0的内容。)
第1章—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#同时包含显式和隐式接口成员实现,可实现一个额外的封装等级,这是其他大多数语言所不支持的。
第9章—值类型:尽管不如定义引用类型那么频繁,但有时确有必要定义行为和C#内置基元类型相似的值类型。本章介绍如何定义结构(struct),同时也强调其特殊性。
第10章—合式类型:本章讨论了更高级的类型定义,解释如何实现操作符,比如+和转型操作符,并描述如何将多个类封装到一个库中。此外,还演示了如何定义命名空间和XML注释,并讨论如何基于垃圾回收机制来设计令人满意的类。
第11章—异常处理:本章延伸讨论第5章引入的异常处理机制,描述了如何利用异常层次结构创建自定义异常。此外,还强调了异常处理的一些最佳实践。
第12章—泛型:泛型或许是C# 1.0最缺少的功能。本章全面讨论自2.0引入的泛型机制。此外,C# 4.0增加了对协变和逆变的支持,本章将在泛型背景中探讨它们。
第13章—委托和Lambda表达式:正因为委托,才使C#与其前身语言(C和C++等)有了显著不同,它定义了在代码中处理事件的模式。这几乎完全消除了写轮询例程的必要。Lambda表达式是使C# 3.0的LINQ成为可能的关键概念。通过学习本章,你将知道Lambda表达式是在委托的基础上构建起来的,它提供了比委托更优雅和简洁的语法。本章内容是第14章讨论的新的集合API的基础。本章还强调了匿名方法应该用新的Lambda表达式代替。
第14章—事件:封装起来的委托(称为事件)是公共语言运行时(Common Language Runtime,CLR)的核心构造。
第15章—支持标准查询操作符的集合接口:通过讨论新的Enumerable类的扩展方法,介绍C# 3.0引入的一些简单而强大的改变。Enumerable类造就了全新的集合API,即“标准查询操作符”,本章对其进行详细讨论。
第16章—使用查询表达式的LINQ:如果只使用标准查询操作符,会形成让人难以辨认的长语句。查询表达式提供了一种类似SQL风格的语法,有效解决了该问题。本章会详细讨论这种表达式。
第17章—构建自定义集合:构建用于操纵业务对象的自定义API时,经常需要创建自定义集合。本章讨论了具体做法,还介绍了能使自定义集合的构建变得更简单的上下文关键字。
第18章—反射、特性和动态编程:20世纪80年代末,程序结构的思维模式发生了根本性的变化,面向对象的编程是这个变化的基础。类似地,特性(attribute)使声明性编程和嵌入元数据成为可能,因而引入了一种新的思维模式。本章探讨了特性的方方面面,并讨论了如何通过反射机制来获取它们。本章还讨论了如何通过基类库(Base Class Library,BCL)中的序列化框架来实现文件的输入输出。C# 4.0新增了dynamic关键字,能将所有类型检查都移至运行时进行,因而极大地扩展了C#的能力。
第19章—多线程处理:大多数现代程序都要求用线程执行长时间运行的任务,同时确保对并发事件的快速响应。随着程序越来越复杂,必须采取其他措施来保护这些高级环境中的数据。多线程应用程序的编写比较复杂。本章讨论了如何操纵线程,并提供一些最佳实践来避免将多线程应用程序弄得一团糟。
第20章—线程同步:本章以第19章为基础,演示如何利用一些内建线程处理模式来简化对多线程代码的显式控制。
第21章—平台互操作性和不安全的代码:必须意识到C#是相对年轻的一种语言,许多现有的代码是用其他语言写成的。为了用好这些现有代码,C#通过P/Invoke提供了对互操作性(调用非托管代码)的支持。此外,C#允许使用指针,也允许执行直接内存操作。虽然使用了指针的代码要求特殊权限才能运行,但它具有与C风格的API完全兼容的能力。
第22章—公共语言基础结构(CLI):事实上,C#被设计成一种在CLI顶部工作的最有效的编程语言。本章讨论了C#程序与底层“运行时”及其规范的关系。
希望本书能作为你建立C#专业能力的丰富资源,并且在精通C#后你仍能将其作为对较少使用的领域的参考。

Mark Michaelis
IntelliTect.com/mark
Twitter: @Intellitect, @MarkMichaelis

上架指导

计算机\程序设计

封底文字

Mark非常聪明,善于打破砂锅问到底,能深刻理解一种技术对于真正的开发人员的影响……他的文字直指技术的本质,敏锐地指出技术的真正价值和问题……没人能像这位大师一样帮你正确理解C# 7.0。
—— Mads Torgersen,微软公司C# 项目经理

作为历年来深受各层次开发人员欢迎的C#指南,本书讨论了从C# 3.0到C# 7.0中最重要的C#特性,强调了现代编程模式,教你如何编写简洁、强大、健壮、安全且易于维护的C#代码。
世界级C#专家Mark Michaelis对C#语言进行了全面而深入的探讨,提供了针对关键C# 7.0增强、C# 7.0和.NET Core/.NET Standard的配合使用以及跨平台编译的专业论述。他用简洁的例子阐释了关键C#构造,并提供了大量优秀实践编程规范,为你进行高效软件开发打好基础。

本书特色
深挖C# 7.0的诸多改进,包括元组、解构函数、模式匹配、本地函数和ref返回等
利用C#面向对象构造写出更健壮的代码
利用泛型、委托、Lambda表达式和事件降低代码复杂度
利用C# 7.0跨平台编译在Linux或MacOS上运行代码
全面掌握多线程处理和同步,包括async/await模式
包括C# 7.1/7.2/7.3语言增强

译者序

从2007年翻译《Essential C# 2.0》开始,我就和这本书以及它的作者Mark Michaelis结下了不解之缘。中间除了因为种种原因未参与《Essential C# 6.0》翻译以外,其他所有版本均由我翻译。
Mark是一个很实在的人。作为运动健将(铁人三项)和技术专家,他深挖事物本质的能力令人惊叹。从表至里,对任何问题他都能做到不仅知其然,还知其所以然。反映在本书中,就是种种知识点有机地联系在一起。最开始不明白的问题,一气呵成读下去会有恍然大悟的感觉。正如本书推荐序作者微软公司C#项目经理Mads Torgersen所说:“一样东西通过了Mark的测试,就没什么好担心的了!”
这本书其实完成了一项非常困难的任务。前面的章节很易于刚入门的开发者理解,而在后面的章节中,作者毫不藏私地将自己对语言的理解倾囊以授,并为有经验的开发者提供了发挥C# 7.0最大潜力所需的详细信息。Mark是组织内容的高手。从第1章起,即使读者中有许多高手,Mark也成功赢得了他们的心。与此同时,全书的所有内容都通俗易懂,没有废话。
这一版是历史上改动最大的一版。针对C# 7.0的新特性,内容编排有了很大变化。感谢框架和语言的进步,以前实现起来比较烦琐的代码现在变简洁了。当然结果就是全书几乎所有代码和相关内容都要重新设计。作为译者,加上错过了上一版,我面对的基本是一本全新的书。
说到本书源代码,不得不说这一版的提供方式是最完美的。本书在GitHub上有专门的项目(https://github.com/IntelliTect/EssentialCSharp),读者可随时下载最新代码并在Visual Studio 2017或更高版本中打开。
感谢作者Mark Michaelis,他是一位极具激情和活力的技术专家。翻译过程中,他热情、耐心地解释了我提出的问题,并虚心、坦诚地采纳了我提出的修改意见。另外,还要感谢编辑关敏,感谢她对我的宽容、耐心和支持。最后要感谢我的家人,尤其是女儿周子衿,她总能从一些新奇的角度帮我重新认识这个世界。
衷心祝愿读者朋友能通过本书,开始愉快而激动人心的C#之旅!

周靖,2019年3月

推荐序

本书是C#最权威、最值得尊重的参考书之一,作者为此付出了非凡的努力!Mark Michaelis的《Essential C#》系列多年来一直是畅销经典。而我刚认识Mark的时候,这本书还处于萌芽阶段。
2005年LINQ(语言集成查询,Language Integrated Query)公布时,我才刚加入微软公司,正好见证了PDC会议上令人激动的公开发布时刻。虽然我对技术本身几乎没有什么贡献,但它的宣传造势我可是全程参加了。那时人人都在谈论它,宣传小册子满天飞。那是C#和.NET的大日子,至今依然令人难忘。
但会场的实践实验室区域却相当安静,那儿的人可以按部就班地试验处于预览阶段的技术。我就是在那儿遇见Mark的。不用说,他一点儿都没有按部就班的意思。他在做自己的试验,梳理文档,和别人沟通,忙着鼓捣自己的东西。
作为C#社区的新人,我感觉自己在那次会议上见到了许多人。但老实说,当时太混乱了,我唯一记得清的就是Mark。因为当问他是否喜欢这个新技术时,他不像别人那样马上开始滔滔不绝,而是非常冷静地说:“还不确定,要自己搞一搞才知道。”他希望完整地理解并消化一种技术,之后才将自己的想法告知于人。
所以我们之间没像我本来设想的那样发生一次快餐式的对话。相反,我们的对话相当坦诚、颇有营养。像这样的交流好多年都没有过了。新技术的细节、造成的后果和存在的问题全都涉及了。对我们这些语言设计者而言,Mark是最有价值的社区成员。他非常聪明,善于打破砂锅问到底,能深刻理解一种技术对于真正的开发人员的影响。但是,最根本的原因可能还是他的坦诚,他从不惧怕说出自己的想法。一样东西通过了Mark的测试,就没什么好担心的了!
这些特质也使Mark成为一名出色的作家。他的文字直指技术的本质,敏锐地指出技术的真正价值和问题,向读者提供最完整的信息且没有废话。没人能像这位大师一样帮你正确理解C# 7.0。
请好好享用本书!

Mads Torgersen,微软公司C#项目经理

图书目录

译者序
推荐序
前言
致谢
作者简介
第1章 C#概述 / 1
1.1 Hello, World / 1
1.2 C#语法基础 / 8
1.3 使用变量 / 14
1.4 控制台输入和输出 / 17
1.5 注释 / 20
1.6 托管执行和CLI / 22
1.7 多个.NET框架 / 26
1.8 小结 / 28
第2章 数据类型 / 29
2.1 基本数值类型 / 29
2.2 更多基本类型 / 36
2.3 null和void / 46
2.4 数据类型转换 / 47
2.5 小结 / 52
第3章 更多数据类型 / 53
3.1 类型的划分 / 53
3.2 可空修饰符 / 55
3.3 元组 / 57
3.4 数组 / 62
3.5 小结 / 74
第4章 操作符和控制流程 / 75
4.1 操作符 / 75
4.2 控制流程概述 / 87
4.3 代码块({}) / 91
4.4 代码块、作用域和声明空间 / 93
4.5 布尔表达式 / 94
4.6 按位操作符(<<,>>,|,&,^,~) / 101
4.7 控制流程语句(续) / 106
4.8 跳转语句 / 115
4.9 C#预处理器指令 / 119
4.10 小结 / 124
第5章 方法和参数 / 126
5.1 方法的调用 / 127
5.2 方法的声明 / 131
5.3 using指令 / 135
5.4 Main()的返回值和参数 / 139
5.5 高级方法参数 / 141
5.6 递归 / 149
5.7 方法重载 / 152
5.8 可选参数 / 154
5.9 用异常实现基本错误处理 / 157
5.10 小结 / 168
第6章 类 / 169
6.1 类的声明和实例化 / 172
6.2 实例字段 / 174
6.3 实例方法 / 176
6.4 使用this关键字 / 177
6.5 访问修饰符 / 183
6.6 属性 / 184
6.7 构造函数 / 197
6.8 静态成员 / 205
6.9 扩展方法 / 213
6.10 封装数据 / 214
6.11 嵌套类 / 216
6.12 分部类 / 218
6.13 小结 / 222
第7章 继承 / 223
7.1 派生 / 224
7.2 重写基类 / 232
7.3 抽象类 / 242
7.4 所有类都从System.Object派生 / 246
7.5 使用is操作符验证基础类型 / 247
7.6 用is操作符进行模式匹配 / 248
7.7 switch语句中的模式匹配 / 248
7.8 使用as操作符进行转换 / 250
7.9 小结 / 251
第8章 接口 / 252
8.1 接口概述 / 253
8.2 通过接口实现多态性 / 254
8.3 接口实现 / 258
8.4 在实现类和接口之间转换 / 262
8.5 接口继承 / 263
8.6 多接口继承 / 265
8.7 接口上的扩展方法 / 265
8.8 通过接口实现多继承 / 266
8.9 版本控制 / 269
8.10 比较接口和类 / 270
8.11 比较接口和特性 / 271
8.12 小结 / 271
第9章 值类型 / 272
9.1 结构 / 275
9.2 装箱 / 279
9.3 枚举 / 285
9.4 小结 / 293
第10章 合式类型 / 295
10.1 重写object的成员 / 295
10.2 操作符重载 / 305
10.3 引用其他程序集 / 311
10.4 定义命名空间 / 318
10.5 XML注释 / 320
10.6 垃圾回收 / 323
10.7 资源清理 / 325
10.8 推迟初始化 / 332
10.9 小结 / 333
第11章 异常处理 / 334
11.1 多异常类型 / 334
11.2 捕捉异常 / 336
11.3 常规catch块 / 339
11.4 异常处理规范 / 341
11.5 自定义异常 / 343
11.6 重新抛出包装的异常 / 346
11.7 小结 / 349
第12章 泛型 / 350
12.1 如果C#没有泛型 / 350
12.2 泛型类型概述 / 355
12.3 约束 / 364
12.4 泛型方法 / 374
12.5 协变性和逆变性 / 377
12.6 泛型的内部机制 / 382
12.7 小结 / 385
第13章 委托和Lambda表达式 / 386
13.1 委托概述 / 387
13.2 声明委托类型 / 390
13.3 Lambda表达式 / 396
13.4 匿名方法 / 401
13.5 小结 / 413
第14章 事件 / 414
14.1 使用多播委托编码Publish-Subscribe模式 / 415
14.2 理解事件 / 426
14.3 小结 / 435
第15章 支持标准查询操作符的集合接口 / 436
15.1 集合初始化器 / 437
15.2 IEnumerable使类成为集合 / 439
15.3 标准查询操作符 / 444
15.4 匿名类型之于LINQ / 470
15.5 小结 / 477
第16章 使用查询表达式的LINQ / 478
16.1 查询表达式概述 / 478
16.2 查询表达式只是方法调用 / 493
16.3 小结 / 494
第17章 构建自定义集合 / 496
17.1 更多集合接口 / 497
17.2 主要集合类 / 498
17.3 提供索引器 / 512
17.4 返回null或者空集合 / 515
17.5 迭代器 / 515
17.6 小结 / 527
第18章 反射、特性和动态编程 / 528
18.1 反射 / 528
18.2 特性 / 539
18.3 使用动态对象进行编程 / 557
18.4 小结 / 565
第19章 多线程处理 / 566
19.1 多线程处理基础 / 568
19.2 使用System.Threading / 572
19.3 异步任务 / 577
19.4 取消任务 / 591
19.5 基于任务的异步模式 / 596
19.6 并行迭代 / 618
19.7 并行执行LINQ查询 / 626
19.8 小结 / 630
第20章 线程同步 / 631
20.1 线程同步的意义 / 632
20.2 计时器 / 653
20.3 小结 / 655
第21章 平台互操作性和不安全代码 / 656
21.1 平台调用 / 657
21.2 指针和地址 / 667
21.3 通过委托执行不安全代码 / 674
21.4 小结 / 676
第22章 公共语言基础结构 / 677
22.1 CLI的定义 / 677
22.2 CLI的实现 / 678
22.3 .NET Standard / 680
22.4 BCL / 681
22.5 将C#编译成机器码 / 681
22.6 运行时 / 682
22.7 程序集、清单和模块 / 685
22.8 公共中间语言 / 687
22.9 公共类型系统 / 687
22.10 公共语言规范 / 688
22.11 元数据 / 688
22.12 .NET Native和AOT编译 / 689
22.13 小结 / 689

教学资源推荐
作者: [美]保罗·戴特尔 (Paul Deitel) 哈维·戴特尔(Harvey Deitel) 著
作者: John Lewis Peter J. DePasquale;Joseph Chase;
参考读物推荐
作者: 王灼洲 著
作者: 王院峰
作者: (美)Henry S. Warren, Jr. 著
作者: