C# 11正式发布

点击蓝字

7b29c8ea08c0cff29bb2678fb843543c.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

C# 11 现已发布。公告称,“随着每个版本的发布,社区的参与度越来越高,贡献了从建议、见解和错误报告到整个功能实现的所有内容。这真的是每个人的 C#。”

新版本中的一些亮点更新内容包括:

UTF-8 字符串(UTF-8 String Literals)

默认情况下,C# 字符串被硬编码为 UTF-16,而 Internet 上通行的字符串编码是 UTF-8。为了最大限度地减少转换的麻烦和性能开销,现在可以简单地为你的 string literals 附加一个u8后缀,以便立即将它们转换为 UTF-8:

var u8 = "This is a UTF-8 string!"u8;

UTF-8 string literals 只是给你返回一个字节块 —— 以ReadOnlySpan<byte>形式。对于那些需要 UTF-8 编码的场景,这可能比一些专门的新的 UTF-8 字符串类型更有用。

阅读有关 UTF-8 字符串文字的文档:https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/reference-types#utf-8-string-literals

原始字符串 (Raw string literals)

从 C# 11 开始,可以使用原始字符串字面量更轻松地创建多行字符串,或使用需要转义序列的任何字符。原始字符串字面量无需使用转义序列。你可以编写字符串,包括空格格式,以及你希望在输出中显示该字符串的方式。 原始字符串字面量:

  • 以至少三个双引号字符序列 (""") 开头和结尾。可以使用三个以上的连续字符开始和结束序列,以支持包含三个(或更多)重复引号字符的字符串字面量。

  • 单行原始字符串字面量需要左引号和右引号字符位于同一行上。

  • 多行原始字符串字面量需要左引号和右引号字符位于各自的行上。

  • 在多行原始字符串字面量中,会删除右引号左侧的任何空格。

Raw string literals 由至少三个双引号分隔:

var raw1 = """This\is\all "content"!""";
Console.WriteLine(raw1);

This prints:

This\is\all "content"!

如果你需要三个或更多的"s 成为你内容的一部分,只需在外部使用更多的"s。开头和结尾必须一致。

var raw2 = """""I can do ", "", """ or even """" double quotes!""""";

这使得粘贴、维护和一目了然地阅读文字所包含的内容变得非常容易。

多行 raw string literals 也可以截断前导空格:末端引号的位置决定了空格开始包含在输出中的位置:

var raw3 = """<element attr="content"><body>This line is indented by 4 spaces.</body></element>""";
//  ^white space left of here is removed

由于末端引号的左侧有四个空格,因此将从每行内容的开头删除四个空格,从而产生以下输出:

<elementattr="content"><body>This line is indented by 4 spaces.</body>
</element>

此外,Raw string literals 还支持插值,可在文档中阅读有关的更多信息:https://learn.microsoft.com/dotnet/csharp/programming-guide/strings/#raw-string-literals

对静态成员进行抽象

在 C# 11 中发布了对接口中静态虚拟成员的支持,此功能在 C# 10 中处于预览状态。有了它,你现在可以定义一个非常简单的数学接口:

publicinterfaceIMonoid<TSelf> whereTSelf: IMonoid<TSelf>
{publicstaticabstractTSelfoperator+(TSelf a, TSelf b);publicstaticabstractTSelfZero{ get; }
}

任何人现在都可以通过为两个静态成员提供实现并将自己作为TSelf类型参数传递来实现此接口:

publicstructMyInt: IMonoid<MyInt>
{intvalue;publicMyInt(int i) => value= i;publicstaticMyIntoperator+(MyInt a, MyInt b) => newMyInt(a.value+ b.value);publicstaticMyIntZero=> newMyInt(0);
}

重要的是,你如何使用这些抽象的操作?当没有实例可供调用时,你如何调用虚拟成员?答案是通过泛型:

T AddAll<T>(params T[] elements) where T : IMonoid<T>
{T result = T.Zero;foreach(var element in elements){result += element;}return result;
}

类型参数TIMonoid<T>接口约束,这使得该接口的静态虚拟成员Zero+可以在Titself 上被调用。

现在我们可以用一些MyInt来调用泛型方法,而+Zero的正确实现则通过类型参数传递进来:

MyInt sum = AddAll<MyInt>(newMyInt(3), newMyInt(4), newMyInt(5));

事实上,.NET 7 提供了一个新的命名空间 System.Numerics,其中充满了数学接口,代表了不同的运算符组合和其他你想使用的静态成员:上述小 IMonoid<T> 接口的 "grown-up" 版本。.NET 中的所有数字类型现在都实现了这些新的接口 -- 你也可以为你自己的类型添加这些接口。

还值得注意的是,静态虚拟成员对数学以外的其他事物也很有用。更多详情可在有关静态抽象接口方法和通用数学的文档中查看。即使你不使用静态虚拟成员创建接口,也可以从他们现在和将来对 .NET 库所做的改进中受益。

列表模式(List patterns)

Pattern matching 是在 C# 7 中引入的,从那时起它已发展成为该语言中最重要和最强大的控制结构之一;C# 11 添加了列表模式从 C# 11 开始,可以将数组或列表与模式的序列进行匹配,如以下示例所示:

int[] numbers = { 1, 2, 3 };Console.WriteLine(numbers is [1, 2, 3]);  // True
Console.WriteLine(numbers is [1, 2, 4]);  // False
Console.WriteLine(numbers is [1, 2, 3, 4]);  // False
Console.WriteLine(numbers is [0 or 1, <= 2, >= 3]);  // True

如前面的示例所示,当每个嵌套模式与输入序列的相应元素匹配时,列表模式就会匹配。可使用列表模式中的任何模式。若要匹配任何元素,请使用弃元模式,或者,如果还想捕获元素,请使用 var 模式,如以下示例所示:

List<int> numbers = new() { 1, 2, 3 };if (numbers is [var first, _, _])
{Console.WriteLine($"The first element of a three-item list is {first}.");
}
// Output:
// The first element of a three-item list is 1.

前面的示例将整个输入序列与列表模式匹配。若要仅匹配输入序列开头或 / 和结尾的元素,请使用列表模式中的切片模式..,如以下示例所示:

Console.WriteLine(new[] { 1, 2, 3, 4, 5 } is [> 0, > 0, ..]);  // True
Console.WriteLine(new[] { 1, 1 } is [_, _, ..]);  // True
Console.WriteLine(new[] { 0, 1, 2, 3, 4 } is [> 0, > 0, ..]);  // False
Console.WriteLine(new[] { 1 } is [1, 2, ..]);  // FalseConsole.WriteLine(new[] { 1, 2, 3, 4 } is [.., > 0, > 0]);  // True
Console.WriteLine(new[] { 2, 4 } is [.., > 0, 2, 4]);  // False
Console.WriteLine(new[] { 2, 4 } is [.., 2, 4]);  // TrueConsole.WriteLine(new[] { 1, 2, 3, 4 } is [>= 0, .., 2 or 4]);  // True
Console.WriteLine(new[] { 1, 0, 0, 1 } is [1, 0, .., 0, 1]);  // True
Console.WriteLine(new[] { 1, 0, 1 } is [1, 0, .., 0, 1]);  // False

切片模式匹配零个或多个元素。最多可在列表模式中使用一个切片模式。

还可以在切片模式中嵌套子模式,如以下示例所示:

voidMatchMessage(string message)
{var result = message is ['a' or 'A', .. var s, 'a' or 'A']? $"Message {message} matches; inner part is {s}.": $"Message {message} doesn't match.";Console.WriteLine(result);
}MatchMessage("aBBA");  // output: Message aBBA matches; inner part is BB.
MatchMessage("apron");  // output: Message apron doesn't match.voidValidate(int[] numbers)
{var result = numbers is [< 0, .. { Length: 2 or 4 }, > 0] ? "valid" : "not valid";Console.WriteLine(result);
}Validate(new[] { -1, 0, 1 });  // output: not valid
Validate(new[] { -1, 0, 0, 1 });  // output: valid

更多详情可查看相关文档:https://learn.microsoft.com/dotnet/csharp/language-reference/operators/patterns#list-patterns

Required members

开发团队已经在多个版本中进行了改进对象的创建和初始化的工作,C# 11 则通过 required members 来继续这些改进。

在创建使用对象初始化器的类型时,曾经无法指定必须初始化某些属性。现在,可以说一个属性或字段是required。这意味着,当创建该类型的对象时,它必须被对象初始化器初始化:

publicclassPerson
{public required stringFirstName{ get; init; }publicstring? MiddleName{ get; init; }public required stringLastName{ get; init; }
}

现在在不初始化两个必需属性的情况下创建一个Person是错误的:

var person = newPerson{ FirstName= "Ada"}; // Error: no LastName!
如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个通用的嵌入式驱动层

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C 语言面向对象编程的最佳实践一、前言以STM32为例&#xff0c;打开网络上下载的例程或者是购买开发板自带的例程&#xff0c;都会发现应用层中会…

cks32和stm32_cks子,间谍,局部Mo子和短管

cks32和stm32本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入了解Mockito的魔力。 您将了解有关“模拟”&#xff0c;“间谍”和“部分模拟”的信息&#xff0c;以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证…

CSON+CJSON,解析json数据更优雅?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言json是目前最为流行的文本数据传输格式&#xff0c;特别是在网络通信上广泛应用&#xff0c;随着物联网的兴起&#xff0c;在嵌入式设备上&a…

让C语言源码可知自身函数的实际地址与大小

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删事情的起因大概是这样……在很久很久以前&#xff0c;我最早用的是MASM&#xff08;Win32ASM&#xff09;写程序&#xff0c;从平台兼容性、开发…

java设计模式迭代器模式_迭代器设计模式示例

java设计模式迭代器模式本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查…

平衡二叉树 C语言代码实现

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1.什么是平衡二叉树平衡二叉树&#xff0c;我们也称【二叉平衡搜索树/AVL】,树中任何节点的两个子树的高度最大差别为1&#xff0c;巴拉巴拉。。…

UDP/TCP 包的大小限制知多少

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、MTU 简述 - 分包后数据包最大长度1、定义Maximum Transmission Unit&#xff08;最大可传输单元&#xff09; 的缩写&#xff0c;它的单位是…

java ee的小程序_扩展Java EE应用程序的基础

java ee的小程序老实说&#xff0c;“可扩展性”是一个详尽的主题&#xff0c;并且通常没有被很好地理解。 通常&#xff0c;它被认为与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 群集 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题&#…

28 张图,一次性说清楚 TCP,速度

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删做IT相关的工作&#xff0c;肯定都离不开网络&#xff0c;网络中最重要的协议是TCP。无论是实际工作还是笔试面试&#xff0c;你看哪里能少得了T…

晨风机器人怎么买奴隶_潮牌复刻和正品该怎么抉择???带你了解了解

今天带你们聊一聊潮牌复刻和正品&#xff0c;简单介绍一下我自己&#xff0c;在复刻圈子五年&#xff0c;我的原则从始至终就是质量放在第一位&#xff0c;之所以能走这么久也是这个原因。回归正题&#xff0c;接着往下看。无论是正品还是复刻&#xff0c;其实还要根据自己的能…

C语言字符串函数strcat | strcpy | strlen | strcmp的用法及原型

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删strcat(str1,str2) 意为将字符串str2连接到字符串str1之后strcat用法如下#include <stdio.h> #include <string.h>int main () {cha…

C语言字符数组与字符串的使用详解

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删正文1、字符数组的定义与初始化字符数组的初始化&#xff0c;最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]{ I, ,a,m, ,‘h,a,p…

5 个牛逼的算法设计,你知道几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、分治法概念&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之…

javafx窗体程序_JavaFX实际应用程序:AISO HRC-Matic

javafx窗体程序“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序&#xff0c;由称为HRC-Matic的关系数据库支持。 它由AISO在日内瓦开发。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客&#xff08; …

几十个Shell分析日志文件脚本!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删收集&#xff0c;整理一些服务器日志分析命令&#xff0c;可以用来分析自己网站服务器日志&#xff0c; 看看网站的访问量。看看有没有黑阔搞破坏…

flex布局水平垂直 垂直_垂直和水平装饰

flex布局水平垂直 垂直装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器&#xff0c;并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确&#xff0c;但是这里有一些值得深思的地方。 The Apartme…

一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删栈是什么&#xff1f;栈有什么作用&#xff1f;首先&#xff0c;栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是后入先出 (LIFO, L…

【C语言】彻底搞懂内存屏障与volatile

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删最有价值的写在最前面内存屏障与 volatile 是高并发编程中比较常用的两个技术&#xff0c;无锁队列的时候就会用到这两项技术。然而这两项技术涉…

熟悉又陌生的arm 编译器详解(armcc/armclang)

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删arm编译器学习首先来了解一下编译器&#xff0c;其通常分为三个部分&#xff1a;前端优化器后端。前端&#xff1a;词法、语法和语义分析&#x…

图文详解STM32单片机远程升级

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、需要两份程序BootLoader和App程序&#xff0c;两份程序均可以通过jlink下载&#xff0c;只需要将下载地址修改一下即可&#xff1a;2、在Boot…