C#是一门平衡性很好的语言。平衡就意味着取舍,以便适应多种用途。你会在嵌入式系统、桌面应用、移动端应用、Web应用、科学计算和机器学习项目以及游戏项目中与它不期而遇。但平衡又很不讨巧,一门稳如泰山的语言总给人一种微妙的感觉:是个多面手,但缺乏夺目的光彩。加之早年C#最主要的运行时.NET Framework只能在Windows平台上运行,因此在开发人员中就更显小众。这可能也是C#在20多年的历史中大部分时间只是静静地积累,在各种语言的“争奇斗艳”中显得“默默无闻”的原因之一吧!
2016年是不寻常的一年,随着.NET Core的发布,.NET的跨平台能力终于不再停留在理论层面上。而后续的持续改进——无论是底层虚拟机还是上层BCL—让它在各个技术雷达上逐步被主流的技术团队锁定。国内外的云平台也开始对.NET进行广泛的支持。而C#语言的发展也正式进入了快车道。2017~2022年这6年C#语言的版本从6.0升级到了11.0,中间发布了8次正式版本,每一次发布均包含明显的语言能力提升,社区的活力也在逐步增强。
现在是入场的绝佳时机,而本书正是学习C#的一站式读物。
C#好学吗?我听到的大部分答案是“不难”。因为它和你平时经常接触的语言太相似了。如果你使用C++、Java、JavaScript或者TypeScript,那么肯定会发现它们的相似之处。这些相似点一般也是良好的切入点。我从2001年就开始使用C#,并参与或主导了许多.NET技术栈的项目,其中最长的项目持续开发超过12年,代码规模超过500万行。在开发过程中有不少其他技术栈的同事加入其中,他们都能够在两三个星期的时间内完全适应C#开发。如果你也是其中的一员,那么本书可以作为案头参考来快速答疑解惑,帮助你解决实际的应用问题。
但是最近我也在重新审视这个问题。大部分项目的功能都存在重复性,模板代码众多。只要能够掌握语言的20%~30%就足以胜任日常开发工作。但是从功能开发到深刻理解其原理,成为设计、开发、诊断、运维的多面手的人却很少。我们需要意识到,C#是一门经历了22年风雨的语言,虽然充满了经验的积淀,但同时也存在各种各样的妥协、失误和兼容性设计。我们可能无从知晓为何在设计之初支持数组的协变,也可能感慨C# 2.0不惜进行接口上的重大变更(breaking change)引入整个泛型系统,好奇为何TryParse不返回可空类型,为何有的泛型集合没有实现对应的非泛型接口,为何Tuple的设计是失败的,GC.KeepAlive方法里为何空空如也……当我们真正探求这些细节时,之前作为切入点的“相似性”反而成为绊脚石。这些细节太过庞杂,以至于我们试图寻求一些更高层的框架和封装来规避它。但如此这般却是“而知也无涯”了,因此还是要回归本源。在我们理解了C#的设计思路后,理解其他的框架也会更加得心应手。这也是我欣赏本书的地方。它并非单纯地堆砌知识,其中不但讲解了C#的发展历史,还在每章中穿插总结了设计思路。因此,即便你对开发已经得心应手,翻阅本书也能受益匪浅。
从小老师就教导我在学习时应当笔不离手,时刻练习,这种方法也适用于学习编程语言。值得一提的是本书的作者也是LINQPad(目前.NET下最流行的代码执行工具之一)的开发者。本书的所有范例都可以直接在LINQPad工具中运行。充分练习这些范例的内容有助于读者快速掌握C#语言的各种实践,因此我建议大家去下载这个工具,并时时修改、执行书中的代码来加深对语言的理解。
本书在前一版的基础上进行了大量的修订工作。在此,感谢本书的作者Joseph Albahari。他对我翻译本书给予了热情的帮助。我们就书中的一些技术细节进行了讨论,我将这些内容放在了译注中。感谢机械工业出版社的编辑老师,他们给予了我很多宝贵的专业建议,他们高标准的把关保证了本书的质量。感谢我的家人,她们的支持给予了我不断前行的动力。希望这本书能给大家带来愉快的阅读体验。请进入C#的精彩世界吧!
刘夏
2022年于北京