关于我们
书单推荐
新书推荐
|
C# 8.0本质论 作为历年来深受各层次开发人员欢迎的C#指南,本书讨论了C# 3.0到C# 8.0中的重要C#特性,强调了现代编程模式,可帮助读者编写简洁、强大、健壮、安全且易于维护的C#代码。 在本书中,世界知名C#专家Mark Michaelis对C#语言进行了全面而深入的探讨,并提供了关于空引用类型、索引和区间、增强模式匹配、异步流等关键C# 8.0增强功能的专业论述。他用简洁的例子阐释关键C#构造,并提供了大量优秀实践编程规范,可为你快速掌握专家级C#编程技能并进行高效软件开发提供翔实指导。 本书内容: 适读人群 :C#开发人员,以及任何对C#语言感兴趣的读者 本书全面讲述C#语言。 对于初学者而言,其内容已远远超过了一本简单的教程,可为读者未来进行高效率软件开发打下坚实基础; 对于已熟悉C#的读者,本书探讨了一些较为复杂的编程思想,并深入讨论了语言较新版本(C# 8.0和.NET Framework 4.8/.NET Core 3.1)的新功能; 对于已经精通这门语言的读者,也可以始终将其作为案头参考。 本书基于管理复杂性的宗旨来组织内容。 第1~5章介绍结构化编程,学习这些内容后,可以立即开始写一些功能简单的代码。 第6~10章介绍C#的面向对象构造,新手应在完全理解这几章的内容之后,再开始接触本书其余部分更高级的主题。 第12~14章介绍更多用于降低复杂性的构造,讲解当今几乎所有程序都要用到的通用设计模式。理解了它们之后,才可以更轻松地理解如何通过反射和特性来进行动态编程。 第15~23章将广泛运用它们来实现线程处理和互操作性。 本书最后专门用一章(第24章)讲解CLI。 这一章在开发平台的背景下对C#语言进行了描述。 在软件工程的发展历史中,用于编写计算机程序的方法经历了几次思维模式的重大转变。每种思维模式都以前一种为基础,宗旨都是增强代码的组织,并降低复杂性。本书将带领你体验相同的思维模式转变过程。 本书开始几章会指导你学习顺序编程结构。在这种编程结构中,语句按编写顺序执行。该结构的问题在于,随着需求的增加,复杂性也会指数级增加。为降低复杂性,将代码块转变成方法,从而产生了结构化编程模型。在这种模型中,可以从一个程序中的多个位置调用同一个代码块,而不需要复制代码。但即使有这种结构,程序还是会很快变得臃肿不堪,需要进一步抽象。所以,在此基础上人们又提出了面向对象编程的概念,这将在第6章中讨论。在此之后,你将继续学习其他编程方法,比如基于接口的编程和LINQ(以及它促使集合API发生的改变),并最终学习通过特性(attribute)进行初级的声明性编程(第18章)。 【本书有以下三个主要职能】。 全面讲述C#语言,其内容已远远超过了一本简单的教程,可为你进行高效率软件开发打下坚实基础。 对于已熟悉C#的读者,本书探讨了一些较为复杂的编程思想,并深入讨论了语言较新版本(C# 8.0和.NET Framework 4.8/.NET Core 3.1)的新功能。 它是你永远的案头参考—即便在你精通了这种语言之后。 成功学习C#的关键在于,要尽可能快地开始编程。不要等自己成为一名理论“专家”之后才开始写代码。所以不要犹豫,马上开始写程序吧。作为迭代开发思想的追随者,我希望即使一名刚开始学习编程的新手,在第2章结束时也能动手编写基本的C#代码。 许多主题本书没有讨论。你在本书中找不到ASP.NET、Entity Framework、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# 8.0最重要的一些增强包括: 字符串插值(第2章) 隐式类型的变量(第3章) 元组(第3章) 可空引用类型(第3章) 模式匹配(第4章) 扩展方法(第6章) 分部方法(第6章) 默认接口成员(第8章) 匿名类型(第12章) 泛型(第12章) Lambda语句和表达式(第13章) 表达式树(第13章) 匿名类型(第15章) 标准查询操作符(第15章) 查询表达式(第16章) 动态编程(第18章) 用任务编程库(TPL)和async进行多线程编程(第20章) 用PLINQ进行并行查询处理(第21章) 并发集合(第22章) 考虑到许多人还不熟悉这些主题,本书围绕它们展开了详细的讨论。涉及高级C#开发的还有“指针”这一主题,该主题将在第23章讨论。即使是有经验的C#开发者,也未必能很透彻地理解这一主题。 【本书特色】 本书是语言参考书,遵循核心C#语言规范(C# Language Specification)。为了帮助读者理解各种C#构造,书中用大量例子演示了每一种特性,而且为每个概念都提供了相应的指导原则和最佳实践,以确保代码能顺利编译,避免留下隐患,并获得最佳的可维护性。为增强可读性,所有代码均进行了特殊格式处理,而且每章内容都用思维导图来概括。 【示例代码】 请登录华章网站(www.hzbook.com)或访问https://IntelliTect.com/EssentialCSharp下载示例代码。 【思维导图】 每章开头都有一幅“思维导图”作为提纲,目的是为读者提供针对每章内容的快速参考。 每章主题显示在思维导图的中心,高级主题围绕中心展开。利用思维导图,读者可方便地搭建自己的知识体系,可以从一个主题出发,更清楚地理解其周边的各个具体概念,避免中途纠缠于一些不相干的枝节问题。 【分类解说】 根据编程水平的不同,可以利用书中的标志来帮助自己轻松找到适合自己的内容。 初学者主题:特别针对入门级程序员提供的定义或解释。 高级主题:可以让有经验的开发者将注意力放在他们最关心的内容上。 标注:用有底纹的标注框强调关键点,引起读者的注意。 语言对比:分散在正文中的补充内容描述了C#和其他语言的关键差异,为熟悉其他语言的读者提供指引。 【本书内容组织】 总体来说,软件工程的宗旨就是管理复杂性。本书基于该宗旨来组织内容。第1章~第5章介绍结构化编程,学习这些内容后,可以立即开始写一些功能简单的代码。第6章~第10章介绍C#的面向对象构造,新手应在完全理解这几章的内容之后,再开始接触本书其余部分更高级的主题。第12章~第14章介绍更多用于降低复杂性的构造,讲解当今几乎所有程序都要用到的通用设计模式。理解了它们之后,才可以更轻松地理解如何通过反射和特性来进行动态编程。后续章节将广泛运用它们来实现线程处理和互操作性。 本书最后专门用一章(第24章)讲解CLI。这一章在开发平台的背景下对C#语言进行了描述。之所以要放到最后,是因为它非C#特有,且不涉及语法和编程风格问题。不过,该章适合在任何时候阅读,或许最恰当的时机是在阅读完第1章之后。 下面是每一章的内容提要。(章号加黑表明那一章含有C# 7.0和C# 8.0的内容。) 第1章:本章在展示了用C#写的HelloWorld程序之后对其进行细致分析。目的是让读者熟悉C#程序的“外观和感觉”,并理解如何编译和调试自己的程序。另外,还简单描述执行C#程序的上下文及其中间语言(Intermediate Language,IL)。 第2章:任何有用的程序都要处理数据,本章介绍C#的基元数据类型。 第3章:本章深入讲解数据类型的两大类别—值类型和引用类型。然后讲解隐式类型局部变量、元组、可空修饰符以及C# 8.0引入的可空引用类型。最后深入讨论基元数组结构。 第4章:计算机最擅长重复性操作,为利用该能力,需知道如何在程序中添加循环和条件逻辑。本章还讨论C#操作符、数据转换和预处理器指令。 第5章:本章讨论方法及其参数的细节,其中包括通过参数来传值、传引用和通过out参数返回数据。C# 4.0新增了默认参数,本章将解释如何使用。 第6章:前面已学过类的基本构成元素,本章合并这些构造,以获得具有完整功能的类型。类是面向对象技术的核心,它定义了对象模板。本章还包括C# 8.0中新引入的可空属性。 第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章:正因为有了委托,C#才与其前身语言(C和C++等)有了显著不同,它定义了在代码中处理事件的模式。这几乎完全消除了写轮询例程的必要。Lambda表达式是使C# 3.0的LINQ成为可能的关键概念。通过学习本章,你将知道Lambda表达式是在委托的基础上构建起来的,它提供了比委托更优雅和简洁的语法。本章内容是后面讨论的集合API的基础。这里还介绍了另一个C# 2.0特性—匿名方法。 第14章:封装起来的委托(称为事件)是公共语言运行时(Common Language Runtime,CLR)的核心构造。 第15章:通过讨论Enumerable类的扩展方法,介绍C# 3.0引入的一些简单而强大的改变。Enumerable类造就了集合API,即“标准查询操作符”,本章对其进行详细讨论。 第16章:如果只使用标准查询操作符,会形成让人难以辨认的长语句。查询表达式提供了一种类似SQL风格的语法,有效解决了该问题。本章会详细讨论这种表达式。 第17章:构建用于操纵业务对象的自定义API时,经常需要创建自定义集合。本章讨论了具体做法,还介绍了能使自定义集合的构建变得更简单的上下文关键字。 第18章:20世纪80年代末,程序结构的思维模式发生了根本性的变化,面向对象的编程是这个变化的基础。类似地,特性(attribute)使声明性编程和嵌入元数据成为可能,因而引入了一种新的思维模式。本章探讨特性的方方面面,并讨论如何通过反射机制来获取它们。本章还讨论如何通过基类库(Base Class Library,BCL)中的序列化框架来实现文件的输入和输出。C# 4.0新增了dynamic关键字,能将所有类型检查都移至运行时进行,因而极大地扩展了C#的能力。 第19章:大多数现代程序都要求用线程执行长时间运行的任务,同时确保对并发事件的快速响应。随着程序越来越复杂,必须采取其他措施来保护这些高级环境中的数据。多线程应用程序的编写比较复杂。本章讨论如何操纵线程,并提供一些最佳实践来避免将多线程应用程序弄得一团糟。 第20章:本章深入研究基于任务的异步模式及其附带的async/await语法。它为多线程编程提供了一种极其简化的方法。此外,还包括异步流的C# 8.0概念。 第21章:引入性能改进的一种简单方法是使用parallel对象或并行LINQ库并行迭代数据。 第22章:本章以第21章为基础,演示如何利用一些内建线程处理模式来简化对多线程代码的显式控制。 第23章:必须意识到C#是一种相对年轻的语言,许多现有的代码是用其他语言写成的。为了用好这些现有代码,C#通过P/Invoke提供了对互操作性(调用非托管代码)的支持。此外,C#允许使用指针,也允许执行直接内存操作。虽然使用了指针的代码要求特殊权限才能运行,但它具有与C风格的API完全兼容的能力。 第24章:事实上,C#被设计成一种在CLI顶部工作的最有效的编程语言。本章讨论C#程序与底层“运行时”及其规范的关系。 希望本书能作为你建立C#专业能力的丰富资源,并且在精通C#后你仍能将其作为对较少使用的领域的参考。 马克.米凯利斯( Mark Michaelis ) Mark Michaelis是创新型软件架构和开发公司IntelliTect的创始人、首席技术架构师和培训师。Mark领导着他的公司不断进取,同时在世界各地举办有关领导力或技术的会议,并代表微软或其他客户进行演讲。他还撰写了大量文章和书籍,并且是东华盛顿大学的客座教授、Spokane .NET用户组的创始人,以及每年一届的TEDx Coeur d'Alene活动的联合组织者。 作为世界知名的C#专家,Mark自2007年以来一直担任微软区域总监,并荣任微软MVP 超过25年。 Mark拥有伊利诺伊大学哲学专业文学学士学位和伊利诺伊理工大学计算机科学硕士学位。 第1章 C# 概述 / 1 1.1 Hello, World / 2 1.2 C#语法基础 / 9 1.3 使用变量 / 16 1.4 控制台输入和输出 / 18 1.5 托管执行和CLI / 24 1.6 多个.NET框架 / 28 1.7 小结 / 30 第2章 数据类型 / 31 2.1 基本数值类型 / 31 2.2 更多基本类型 / 38 2.3 数据类型转换 / 49 2.4 小结 / 55 第3章 更多数据类型 / 56 3.1 类型的划分 / 56 3.2 将变量声明为可空 / 58 3.3 隐式类型的局部变量 / 62 3.4 元组 / 64 3.5 数组 / 68 3.6 小结 / 82 第4章 操作符和控制流程 / 83 4.1 操作符 / 83 4.2 控制流程概述 / 95 4.3 代码块 / 99 4.4 代码块、作用域和声明空间 / 101 4.5 布尔表达式 / 102 4.6 关于null的编程 / 107 4.7 按位操作符 / 112 4.8 控制流程语句 / 116 4.9 跳转语句 / 124 4.10 C#预处理器指令 / 129 4.11 小结 / 135 第5章 方法和参数 / 136 5.1 方法的调用 / 137 5.2 方法的声明 / 141 5.3 using指令 / 145 5.4 Main()的返回值和参数 / 149 5.5 高级方法参数 / 151 5.6 递归 / 159 5.7 方法重载 / 162 5.8 可选参数 / 164 5.9 用异常实现基本错误处理 / 167 5.10 小结 / 178 第6章 类 / 179 6.1 类的声明和实例化 / 182 6.2 实例字段 / 184 6.3 实例方法 / 186 6.4 使用this关键字 / 187 6.5 访问修饰符 / 193 6.6 属性 / 194 6.7 构造函数 / 207 6.8 不可空引用类型属性与构造函数 / 214 6.9 可空特性 / 217 6.10 解构函数 / 219 6.11 静态成员 / 220 6.12 扩展方法 / 228 6.13 封装数据 / 229 6.14 嵌套类 / 231 6.15 分部类 / 233 6.16 小结 / 236 第7章 继承 / 237 7.1 派生 / 238 7.2 重写基类 / 244 7.3 抽象类 / 253 7.4 所有类都从System.Object派生 / 258 7.5 用is操作符进行模式匹配 / 259 7.6 switch语句中的模式匹配 / 264 7.7 避免对多态类对象使用模式匹配 / 265 7.8 小结 / 267 第8章 接口 / 268 8.1 接口概述 / 269 8.2 通过接口实现多态性 / 270 8.3 接口实现 / 274 8.4 在实现类和接口之间转换 / 278 8.5 接口继承 / 278 8.6 多接口继承 / 280 8.7 接口上的扩展方法 / 281 8.8 版本升级 / 283 8.9 扩展方法与默认接口成员 / 295 8.10 比较接口和抽象类 / 296 8.11 比较接口和特性 / 297 8.12 小结 / 297 第9章 值类型 / 298 9.1 结构 / 301 9.2 装箱 / 305 9.3 枚举 / 311 9.4 小结 / 319 第10章 合式类型 / 321 10.1 重写object的成员 / 321 10.2 操作符重载 / 331 10.3 引用其他程序集 / 337 10.4 类型封装 / 342 10.5 定义命名空间 / 343 10.6 XML注释 / 346 10.7 垃圾回收 / 349 10.8 资源清理 / 352 10.9 推迟初始化 / 363 10.10 小结 / 365 第11章 异常处理 / 366 11.1 多异常类型 / 366 11.2 捕捉异常 / 368 11.3 重新抛出现有异常 / 370 11.4 常规catch块 / 371 11.5 异常处理规范 / 372 11.6 自定义异常 / 374 11.7 重新抛出包装的异常 / 377 11.8 小结 / 380 第12章 泛型 / 381 12.1 如果C#没有泛型 / 381 12.2 泛型类型概述 / 386 12.3 约束 / 395 12.4 泛型方法 / 407 12.5 协变性和逆变性 / 411 12.6 泛型的内部机制 / 416 12.7 小结 / 419 第13章 委托和Lambda表达式 / 420 13.1 委托概述 / 421 13.2 声明委托类型 / 424 13.3 Lambda表达式 / 430 13.4 匿名方法 / 435 13.5 委托没有结构相等性 / 436 13.6 外部变量 / 438 13.7 表达式树 / 441 13.8 小结 / 447 第14章 事件 / 448 14.1 使用多播委托实现Publish-Subscribe模式 / 449 14.2 理解事件 / 460 14.3 小结 / 468 第15章 支持标准查询操作符的集合接口 / 469 15.1 集合初始化器 / 470 15.2 IEnumerable使类成为集合 / 472 15.3 标准查询操作符 / 476 15.4 匿名类型之于LINQ / 503 15.5 小结 / 509 第16章 使用查询表达式的LINQ / 510 16.1 查询表达式概述 / 510 16.2 查询表达式只是方法调用 / 525 16.3 小结 / 526 第17章 构建自定义集合 / 528 17.1 更多集合接口 / 529 17.2 主要集合类 / 530 17.3 提供索引器 / 544 17.4 返回null或者空集合 / 547 17.5 迭代器 / 547 17.6 小结 / 559 第18章 反射、特性和动态编程 / 560 18.1 反射 / 560 18.2 nameof操作符 / 569 18.3 特性 / 571 18.4 使用动态对象进行编程 / 585 18.5 小结 / 592 第19章 多线程概述 / 594 19.1 多线程基础 / 595 19.2 异步任务 / 600 19.3 取消任务 / 614 19.4 使用System.Threading / 618 19.5 总结 / 619 第20章 基于任务的异步模式编程 / 620 20.1 同步执行高延迟操作 / 621 20.2 使用TPL实现异步执行高延迟操作 / 623 20.3 使用async/await实现基于任务的异步模式 / 627 20.4 异步返回值ValueTask 20.5 异步流 / 633 20.6 IAsyncDisposable接口以及await using声明和语句 / 637 20.7 使用LINQ和IAsync-Enumerable / 637 20.8 返回void的异步方法 / 639 20.9 异步Lambda表达式和本地函数 / 642 20.10 任务调度器和同步上下文 / 647 20.11 在Windows UI程序中使用async/await / 649 20.12 小结 / 652 第21章 并行迭代 / 653 21.1 并行执行循环迭代 / 653 21.2 并行执行LINQ查询 / 661 21.3 小结 / 666 第22章 线程同步 / 667 22.1 线程同步的意义 / 668 22.2 计时器 / 689 22.3 小结 / 691 第23章 平台互操作性和不安全代码 / 692 23.1 平台调用 / 693 23.2 指针和地址 / 703 23.3 通过委托执行不安全代码 / 710 23.4 小结 / 711 第24章 公共语言基础结构 / 712 24.1 CLI的定义 / 712 24.2 CLI的实现 / 713 24.3 .NET Standard / 715 24.4 基类库 / 716 24.5 将C#编译成机器码 / 716 24.6 运行时 / 717 24.7 程序集、清单和模块 / 720 24.8 公共中间语言 / 722 24.9 公共类型系统 / 722 24.10 公共语言规范 / 723 24.11 元数据 / 723 24.12 .NET Native和AOT编译 / 724 24.13 小结 / 724
你还可能感兴趣
我要评论
|