C# 8.0 的新特性概览和讲解

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

前言

2018年11月12日微软在 MSDN 博客的 Building C# 8.01 一文发表了新的 C# 8.0 即将发布的特性,现在让我们来看一下。

新的改变

  1. 可空引用类型
  2. 异步流
  3. 范围和下标类型
  4. 接口成员的默认实现
  5. 模式匹配表达式和递归模式语句
  6. 目标类型推导

可空引用类型(Nullable reference types)

从此,引用类型将会区分是否可分,可以从根源上解决 NullReferenceException。但是由于这个特性会打破兼容性,因此没有当作 error 来对待,而是使用 warning 折衷,而且开发人员需要手动 opt-in 才可以使用该特性(可以在项目层级或者文件层级进行设定)。
例如:

string s = null; // 产生警告: 对不可空引用类型赋值 null
string? s = null; // Ok

void M(string? s)
{
    Console.WriteLine(s.Length); // 产生警告:可能为 null
    if (s != null)
    {
        Console.WriteLine(s.Length); // Ok
    }
}

至此,妈妈再也不用担心我的程序到处报 NullReferenceException 啦!

异步流(Async streams)

考虑到大部分 Api 以及函数实现都有了对应的 async版本,而 IEnumerable<T>IEnumerator<T>还不能方便的使用 async/await就显得很麻烦了。
但是,现在引入了异步流,这些问题得到了解决。
我们通过新的 IAsyncEnumerable<T>IAsyncEnumerator<T>来实现这一点。同时,由于之前 foreach是基于IEnumerable<T>IEnumerator<T>实现的,因此引入了新的语法await foreach来扩展 foreach的适用性。
例如:

async Task<int> GetBigResultAsync()
{
    var result = await GetResultAsync();
    if (result > 20) return result; 
    else return -1;
}

async IAsyncEnumerable<int> GetBigResultsAsync()
{
    await foreach (var result in GetResultsAsync())
    {
        if (result > 20) yield return result; 
    }
}

范围和下标类型(Ranges and indices)

C# 8.0 引入了 Index 类型,可用作数组下标,并且使用 ^ 操作符表示倒数。
不过要注意的是,倒数是从 1 开始的。

Index i1 = 3;  // 下标为 3
Index i2 = ^4; // 倒数第 4 个元素
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

除此之外,还引入了 “..” 操作符用来表示范围(注意是左闭右开区间)。

var slice = a[i1..i2]; // { 3, 4, 5 }

关于这个下标从 0 开始,倒数从 1 开始,范围左闭右开,笔者刚开始觉得很奇怪,但是发现 Python 等语言早已经做了这样的实践,并且效果不错。因此这次微软也采用了这种方式设计了 C# 8.0 的这个语法。

接口的默认实现方法(Default implementations of interface members)

从此接口中可以包含实现了:

interface ILogger
{
    void Log(LogLevel level, string message);
    void Log(Exception ex) => Log(LogLevel.Error, ex.ToString()); // 这是一个默认实现重载
}

class ConsoleLogger : ILogger
{
    public void Log(LogLevel level, string message) { ... }
    // Log(Exception) 会得到执行的默认实现
}

在上面的例子中,Log(Exception)将会得到执行的默认实现。

模式匹配表达式和递归模式语句(Switch expressions and recursive patterns)

现在可以这么写了(patterns 里可以包含 patterns)

IEnumerable<string> GetEnrollees()
{
    foreach (var p in People)
    {
        if (p is Student { Graduated: false, Name: string name }) yield return name;
    }
}

Student { Graduated: false, Name: string name }检查 p 是否为 Graduated = falseNamestringStudent,并且迭代返回 name
可以这样写之后是不是很爽?

更有:

var area = figure switch 
{
    Line _      => 0,
    Rectangle r => r.Width * r.Height,
    Circle c    => c.Radius * 2.0 * Math.PI,
    _           => throw new UnknownFigureException(figure)
};

典型的模式匹配语句,只不过没有用“match”关键字,而是沿用了
了“switch”关键字。
但是不得不说,一个字,爽!

目标类型推导(Target-typed new-expressions)

以前我们写下面这种变量/成员声明的时候,大概最简单的写法就是:

var points = new [] { new Point(1, 4), new Point(2, 6) };

private List<int> _myList = new List<int>();

现在我们可以这么写啦:

Point[] ps = { new (1, 4), new (3,-2), new (9, 5) };

private List<int> _myList = new ();

是不是更加的舒服了?

注意事项

  1. 以上的新特性需要 .NET Standard 2.1/.NET Core 3.0/.NET Framework 4.8 及以上来支持。
  2. 但是,由于接口的默认实现方法这个特性需要 CLR 的支持,而 .NET Framework 4.8 还没有来得及做出修改,因此此特性在 .NET Framework 4.8 中不可用,需要等待进一步的更新。
  3. C# 8.0 截至发文可以说已经定型了,正式发布还需要等一阵子。

一些想法

  1. 本次 C# 8.0 的更新,Record2估计是要被鸽了,有些小遗憾。
  2. C# 一直都在不断地完善和补充自己的语法体系,这和官方给出的 C# 发展目标相同,即:不断容纳各种优秀和现代的语法特性,追求多样化。相信这门优秀的语言未来会带给我们更多的惊喜。希望大家不要抱着老旧的看法对待这门语言,都 8012 年了我们也应该用全新的姿态去审视这门语言,去尝试一下新的语法对编码效率带来的大幅度提升。
  3. C# 的 IDE 除了 Visusl Studio 之外,还有 Visual Studio for Mac 以及跨平台的 Visual Studio Code、JetBrain 出品的 Rider 跨平台 C# IDE,极大程度的方便了开发者。
  4. 从近几年的发展来看,微软面对开源、生态建设、开发者、社区、跨平台等的重视程度不断上升,相信 .NET Core 的前景一定会更好。

参考文献


  1. https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0 ↩︎

  2. https://github.com/dotnet/csharplang/issues/39 ↩︎

相关推荐

C# 8.0 新语法的学习使用

C# 8.0微软在 2019 年 9 月 23 日随 .NET Core 3.0 一同发布的一个重要版本更新,带来了许多新的语言特性改进。本文将详细介绍 C# 8.0 的新语法,并通过实际应用案例展示这些新特性的使用方法。

weixin_72139050的博客 999

C#8.0新特性学习

本文为C#8.0新特性的学习,参考文章:http://www.360doc.com/content/21/0325/08/65839416_968742655.shtml https://cloud.tencent.com/developer/article/1966061

weixin_46102505的博客 975

C#8.0本质论:C#开发者必备的权威

C#8.0本质论》由C#专家Mark Michaelis撰写,是一本全面深入的C#技术书籍,适合从初学者到高级开发者的多层次读者。书中详细解析了C# 8.0新特性,如可空引用类型、异步流等,并提供了丰富的示例代码最佳实践。全书结构清晰,从基础知识到高级编程,涵盖了面向对象构造、集合与LINQ、多线程处理等内容。作者通过系统性讲解实用建议,帮助读者编写高质量、高效的C#代码。这本书不仅是一本教程,更是C#开发者的参考南,适合希望在快速发展的编程世界中保持技术更新的开发者。

冰茶的博客 7986

盘点C# 8.0中好用的特性

盘点C# 8.0中好用的特性

程序员ken的博客 1247

C#.net 6.08.0有什么区别,以及8.0增加了那些功能,这些功能有那些作用

最近博主开始找工作,面试得时候技术官问了这么个问题,说实在得,博主还没特意去了解, .net 6.0.net 8.0得区别,以及8.0到底增加了那些功能? 所以,这篇文章我们就大概了解下。 博主在写这篇文章得时候,微软已经出到了core得10.0版本,不断迭代更新是好事,但是,实际项目还是不要贸然升级,需要一个过渡期,因为有些客户端可能不一定能支持最新版本。

小5聊的博客 4296

C# 8.0 添加增强的功能

最常见的方案是,可以将成员添加到已经由无数客户端发布并使用的接口。

风清扬的专栏 624

C# 8.0核心技术

C# 8.0核心技术南》介绍了C#的语言特性。在内容上,它兼顾了各种类型的读者。对于初学者,《C# 8.0核心技术南》不论是介绍基本的语法,还是介绍高级的语言特性,都采用了讲解示例结合的方法。而对于经验丰富的读者,《C# 8.0核心技术南》的每一章都详尽而系统,是绝佳的案头参考书。 《C# 8.0核心技术南》在前一版的基础上进行了大量的修订工作。不但将既有的内容范例全部迁移到.NET Core之上,对C# 8.0.NET Core 3.x提供的新特性进行了详细的介绍,还在部分示例中专门对

互动出版网 2902

C# 8.0 如何在项目中开启可空引用类型的支持

C# 8.0 引入了可为空引用类型不可为空引用类型。由于这是语法级别的支持,所以比传统的契约式编程具有更强的约束力。更容易帮助我们消灭 null 异常。 本文将介绍如何在项目中开启 C# 8.0 的可空引用类型的支持。 本文内容使用 Sdk 风格的项目文件在项目文件中开启可空引用类型的支持可为空注释(Annotation)上下文可为空警告上下文在源代码文件中开启可空引用类型的支持早期版本的属性...

walterlv - 吕毅 2443

C#8.0新特性详解--大道至简

C#8.0新增了14个新的特性,代码项目会针对每个特性从定义、使用、目的、影响四个方面进行示例讲解

少侠Smile丶 4449

一篇文章带你掌握 C# 5/6/7 新特性

**摘要:**本文系统梳理了C# 5.0-7.0的核心新特性,通过代码示例对比新旧语法差异。重点包括:C#5.0的异步编程(async/await)循环变量捕获修复;C#6.0的自动属性初始化器、空值条件运算符(?.)异常过滤器;C#7.0的模式匹配、元组解构、ref局部变量等。文章强调新语法在可读性、性能维护性上的优势,并给出渐进式重构建议:从基础语法升级(如?.替代判空)到高级特性应用(模式匹配重构核心逻辑)。通过掌握现代语法,开发者能编写更简洁、安全且高效的代码。

许泽宇的技术分享 5292

C#8.0 and .NET Core 3.0 高级编程学习笔记】

C#学习笔记

weixin_42358669的博客 2235

C#3.0 有哪些新特性

1:隐式类型化本地变量 这个特性非常简单,有些JavaScript的影子,我们可以统一使用使用”var”关键字来声明局部变量,而不再需要明变量的确切类型了,变量的确切类型可通过声明变量时的初始值推断出来。这样一来,可以大大简化我们声明局部变量的工作量了,下面是一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

寂寞青山的博客 1047

C# 6.0 Cookbook 4th Edition:深入实践与代码实例

本文还有配套的精品资源,点击获取 简介:《C# 6.0 Cookbook 4th Edition》是一本专注于C# 6.0新特性的实践教程,由O'Reilly出版,涵盖从字符串插值、异步编程到面向对象编程的广泛应用。本书通过详尽的代码示例,深入讲解C#的各个方面,包括LINQ查询、泛型编程、异常处理、并发多线程技术,以及如何在Visual Studio中集成这些概念。配...

weixin_32456485的博客 995

C#新特性C#核心技术浅解)

核心技术无论对于公司而言,还是对于个人而言,都是非常有价值的关键特性。一个掌握了核心技术的开发者,必然是脱离了低级趣味的专业开发者,在纷繁复杂的互联网时代面前,往往有更多机会凸显自己的才华,进而获得与自己实力相匹配的待遇水平。 目录目录1️⃣ C#的发展历程2️⃣ C#新特性3️⃣ C#新特性-C#可为空类型可为空值类型 C#可为空引用类型可为空上下文4️⃣ C#新特性-属性模式5️⃣ C#新特性-Json处理6️⃣ C#新特性-spanMemoryC#是由伟大的程序员之神Anders Hej

我是慎独玩家,无人见处,自有尺度! 2773

聊一聊C# 8.0中的await foreach

为什么写这篇文章# Async Streams这个功能已经发布很久了,在去年的Build 2018 The future of C#就有演示,最近VS 2019发布,在该版本的Release Notes中,我再次看到了这个新特性,因为对异步编程不太熟悉,所以借着这个机会,学习新特性的同时,把异步编程重温一遍. 本文内容,参考了Bassam Alugili在InfoQ中发表的Async Strea...

dz45693的专栏 2100

C# 1.0C# 9.0,历代 C# 语言特性一览

本文内容C# 版本历史记录C# 版本特性说明C# 7.0元组弃元更多的 expression-bodied 成员`out`变量异步 `Main` 方法模式匹配引发表达式C# 8.0默认接口方法异步流索引范围C# 9.0Record顶级语句模式匹配增强参考链接 C# 版本历史记录 说明:因为Markdown下维护这样复杂的表格有一点麻烦,故,这里以图片形式展示出来,如后续内容有更新,请点击 这里 访问原始笔记链接。为知笔记 的表格渲染在移动端表现不佳,为了获得更好的阅读体验,请在电脑端访问查看。 C

素履独行 | 元培的个人博客 8299

C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development》是一本全面介绍C# 8.0.NET Core 3.0的书籍

C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development》(第四版,作者:Mark J. Price)是一本全面介绍C# 8.0.NET Core 3.0的书籍,适合初学者希望更新知识的开发者。以下是对该书每章的详细介绍,包括核心内容、具体实例Demo、经典案例、评价、常见问题与易错点总结,结合《CLR via C#》的异步编程反射知识,以及现代.NET特性(如异步流)。本书第7章介绍反射,但未深入性能优化。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1091

IE 8.0 Beta1 新特性之—— WebSlice

WebSlices 允许用户订阅的网页部分内容。用户通常每天访问网站很多次以查看是否有新的更新。 RSS 源简化此体验: 用户可以订阅更新并查看它们的摘要,而不必导航到每个站点。 IE 8 Beta 1 添加了 WebSlices的功能。 WebSlices 是一项新的功能为 Web 站点与用户进行连接,允许用户直接订阅网页内容。 WebSlices 行为就像是信息源(Feed),其中客户端可以订

sinxy的专栏 1187
上一篇: .NET Core 3.0 前瞻:可用于构建 Windows 窗体应用程序
下一篇: Java 11 和 Java 12 分别与 .NET Core 2.2 和 .NET Core 3.0 (preview 6) 的性能对比测试
hez2010
博客等级 码龄14年 15粉丝 6原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值