当前位置: 首页 > news >正文

技术速递|C# 13:探索最新的预览功能

作者:Kathleen Dollard
排版:Alan Wang

C# 13 已初具雏形,其新特性侧重于灵活性、性能以及使您最喜欢的功能在日常中变得更容易使用。我们以公开的方式构建 C#,在今年的 Microsoft Build 大会上,我们会让您一睹 C# 13 的精彩之处。今天,我们想分享一下 C# 13 当前的状态,以及您今天就可以尝试的新功能,并提供有关此版本及以后计划中的功能更新。让我们更详细地了解这些新功能。

  • 增强了 params 集合以实现更强的灵活性
  • lock 对象
  • 索引运算符改进
  • 转义序列 \e
  • Partial 属性
  • 方法组自然类型改进
  • Async 方法和迭代器中的 ref 和 unsafe
  • 扩展类型更新

立即试用 C# 13

在我们深入研究 C# 13 的每个新功能之前,您可能想知道如何使用它。

您可以在最新的 .NET 9 预览版(撰写本文时为预览版 6)和 Visual Studio 2022-17.11 的最新预览版中找到 C# 13 的最新预览版。若要访问预览功能,请在项目文件中将您的语言版本设置为 preview:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><!--其他设置--><LangVersion>preview</LangVersion><!--其他设置--></PropertyGroup>
</Project>

Params 集合

C# 13扩展了 params 关键字,使其适用于可以通过集合表达式构造的任何类型。无论是编写方法还是调用方法,都增加了灵活性。

当 params 关键字出现在参数之前时,对该方法的调用可以提供零个或多个值的逗号分隔列表。以下内容适用于所有版本的 C#:

public void WriteNames(params string[] names)=> Console.WriteLine(String.Join(", ", names));
WriteNames("Mads", "Dustin", "Kathleen");
WriteNames(new string[] {"Mads", "Dustin", "Kathleen"});
// 这两个都会输出:Mads、Dustin、Kathleen

请注意,您可以使用逗号分隔的值列表或基础类型的对象来调用该方法。

从 C# 13 开始,params 参数可以是集合表达式支持的任何类型。例如:

public void WriteNames(params List<string> names)=> Console.WriteLine(String.Join(", ", names));

每当调用具有 IEnumerable 参数的方法时,都可以传递 LINQ 表达式的结果。如果 IEnumerable 参数具有 params 修饰符,还可以传递逗号分隔列表。当有常量,可以使用逗号分隔列表;当您需要 LINQ 表达式时,您可以使用它:

public void WriteNames(params IEnumerable<string> names)=> Console.WriteLine(String.Join(", ", names));
var persons = new List<Person>
{new Person("Mads", "Torgersen"),new Person("Dustin", "Campbell"),new Person("Kathleen", "Dollard")
};
//以下所有输出:Mads、Dustin、Kathleen
WriteNames("Mads", "Dustin", "Kathleen");
WriteNames(persons.Select(person => person.FirstName));
WriteNames(from p in persons select p.FirstName);

重载解析

编写方法时,可以提供多个 params 重载。例如,添加 IEnumerable 重载可支持 LINQ,添加 ReadOnlySpan 或 Span 重载可减少分配,从而可以提高性能。

public void WriteNames(params string[] names)=> Console.WriteLine(String.Join(", ", names));
public void WriteNames(params ReadOnlySpan<string> names)=> Console.WriteLine(String.Join(", ", names));
public void WriteNames(params IEnumerable<string> names)=> Console.WriteLine(String.Join(", ", names));

当传递指定类型之一时,将使用该重载。当传递逗号分隔值或不传递任何值时,将选择最佳重载。使用上述重载:

// 使用 IEnumerable 重载
WriteNames(persons.Select(person => person.FirstName)); 
// 使用数组重载
WriteNames(new string[] {"Mads", "Dustin", "Kathleen"}); 
// 使用最有效的过载:当前为 ReadOnlySpan
WriteNames("Mads", "Dustin", "Kathleen");    

多重重载可以增加便利性并提高性能。库作者应该为所有重载提供相同的语义,这样调用者就不需要关心使用了哪个重载。

Lock 对象

.NET 9 包含一种新的用于互斥的 System.Threading.Lock 类型,比仅在任意 System.Object 实例上进行锁定更有效。System.Threading.Lock 类型提案详细介绍了该类型及其创建原因。随着时间的推移,该类型有望成为 C# 代码中大多数锁定的主要机制。

C# 13 使该类型的使用变得简单。当编译器识别出 lock 语句的目标是 System.Threading.Lock 对象时,C# 就会生成对 System.Threading.Lock API 的调用,并在 Lock 实例可能被错误地视为普通 object 的情况下提供警告。

此更新意味着 lock 语句的熟悉语法利用了运行时中的新功能。熟悉的代码只需进行少量更改即可变得更好。只需将项目的 TargetFramework 更改为 .NET 9,并将 lock 的类型从 object 更改为 System.Threading.Lock:

public class MyClass 
{private object myLock = new object();public void MyMethod() {lock (myLock){// 您的代码}          }
}
public class MyClass 
{// 以下行是唯一的变化private System.Threading.Lock myLock = new System.Threading.Lock();public void MyMethod() {lock (myLock){// 您的代码}     }
}

从初始化器末尾开始的索引

索引运算符 ^ 允许您在可计数集合中相对于集合末尾指定一个位置。这现在适用于初始化器:

class Program
{ static void Main(){var x = new Numbers{Values = {[1] = 111,[^1] = 999  // 从 C# 13 开始的工作}// x.Values[1] 为 111// x.Values[9] 为 999,因为它是最后一个元素};}
}
class Numbers
{public int[] Values { get; set; } = new int[10];
}

转义序列 \e

C# 13 为众所熟知的 ESCAPE 或 ESC 字符引入了新的转义序列。以前您必须将其输入为 \u001b 的变体。当使用 VT100/ANSI 转义码与 System.Console 的终端交互时,此新序列特别方便。例如:

// C# 13 之前版本
Console.WriteLine("\u001b[1mThis is a bold text\u001b[0m");
// 使用 C# 13
Console.WriteLine("\e[1mThis is a bold text\e[0m");

这使得创建精美的终端输出变得更容易并且更不容易出错。

Partial 属性

C# 13 添加了 partial 属性。与 partial 方法一样,它们的主要目的是支持源生成器。Partial 方法已在许多版本中可用,并在 C# 9 中进行了额外的改进。Partial 属性与它们的 partial 方法非常相似。

例如,从 .NET 7(C# 12)开始,正则表达式源生成器为方法创建高效的代码:

[GeneratedRegex("abc|def")]
private static partial Regex AbcOrDefMethod();
if (AbcOrDefMethod().IsMatch(text))
{// 使用匹配的文本采取行动
}

在 .NET 9(C# 13)中,Regex 源生成器已更新,如果您更喜欢使用属性,您也可以使用:

[GeneratedRegex("abc|def")]
private static partial Regex AbcOrDefProperty { get; };
if (AbcOrDefProperty.IsMatch(text))
{// 使用匹配的文本采取行动
}

Partial 属性将使源生成器设计人员更容易创建自然感觉的 API。

方法组自然类型改进

表达式的自然类型是由编译器确定的类型,例如当类型分配给 var 或 Delegate 时。当它是一个简单类型时,这很简单。在 C# 10 中,我们添加了对方法组的支持。当您将不带括号的方法名称作为委托包含时,将使用方法组:

Todo GetTodo() => new(Id: 0, Name: "Name");
var f = GetTodo; // f 的类型是 Func<ToDo>

C# 13 完善了确定自然类型的规则,以便根据范围考虑候选者并删除没有成功机会的候选者。更新这些规则意味着在使用方法组时编译器错误会更少。

allows ref struct

C# 13 添加了一种指定泛型类型参数功能的新方法。默认情况下,类型参数不能为 ref struct。但是 C# 13 允许您指定类型参数可以是 ref struct,并应用相应的规则。虽然其他泛型约束限制了可用作类型参数的类型集,但此新规范扩展了允许的类型。我们认为这是一种反约束,因为它删除了限制,而不是添加了限制。where 子句中的语法 allows ref struct,其中 allows 表示用法上的扩展:

T Identity<T>(T p)where T : allows ref struct=> p;
// Okay
Span<int> local = Identity(new Span<int>(new int[10]));

使用 allows ref struct 指定的类型参数具有 ref struct 类型的所有行为和限制。

Async 方法和迭代器中的 ref 和 unsafe

在 C# 13 之前,迭代器方法(使用 Yield Return 的方法)和 async 方法不能声明局部 ref 变量,也不能具有 unsafe 的上下文。

在 C# 13 中,async 方法可以声明 ref 局部变量,或 ref struct 类型的局部变量。这些变量不能跨 await 边界或 Yield return 边界保存。

同样,C# 13 允许迭代器方法中使用 unsafe 上下文。但是,所有 Yield Return 和 Await 语句都必须在safe上下文中。这些放宽的限制让您可以在更多地方使用 ref 局部变量和 ref struct类型。

扩展类型的更新

我们对 Mads 和 Dustin 在 Build 上展示的扩展类型功能感到非常兴奋。我们还在 Build 上的博客文章 .NET 公告中介绍了扩展类型。当时,我们的目标是在 C# 13中实现该功能的关键部分,但设计和实现将需要更多的时间。请在早期的 C# 14(NET 10)预览版中查找扩展类型。

总结

您可以在 C# 13 的新增功能中了解更多相关内容。我们仍在为 C# 13 开发新功能,您可以在 Roslyn 功能状态页面查看我们正在做的事情。此外,请务必关注 .NET 9 预览版发行说明,您现在可以在其中找到每个版本的 C# 发行说明。

请下载带有 .NET 9 的 Visual Studio 2022-17.11 的最新预览版,体验这些新功能,并告诉我们您的想法!

相关文章:

技术速递|C# 13:探索最新的预览功能

作者&#xff1a;Kathleen Dollard 排版&#xff1a;Alan Wang C# 13 已初具雏形&#xff0c;其新特性侧重于灵活性、性能以及使您最喜欢的功能在日常中变得更容易使用。我们以公开的方式构建 C#&#xff0c;在今年的 Microsoft Build 大会上&#xff0c;我们会让您一睹 C# 13 …...

Python设计模式:巧用元类创建单例模式!

✨ 内容&#xff1a; 今天我们来探讨一个高级且实用的Python概念——元类&#xff08;Metaclasses&#xff09;。元类是创建类的类&#xff0c;它们可以用来控制类的行为。通过本次练习&#xff0c;我们将学习如何使用元类来实现单例模式&#xff0c;确保某个类在整个程序中只…...

构建自主可控的工业操作系统,筑牢我国工业安全堡垒

构建自主可控的工业操作系统&#xff0c;筑牢我国工业安全堡垒&#xff0c;鸿道(Intewell)操作系统为国家工业发展保驾护航。 7月19日&#xff0c;全球多地安装微软操作系统的电脑设备出现大规模宕机&#xff0c;导致“蓝屏”现象&#xff0c;严重影响了航空、铁路、医疗、金…...

WPF串口通讯程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…...

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展&#xff0c;汽车自动化、智能化程度的逐步提高&#xff0c;人们对汽车的安全性、舒适性、娱乐性等要求也不断提高&#xff0c;加上汽车节能减排法规的不断严峻&#xff0c;整车电气设备不断增加&#xff0c;作为连接汽车各种电器设备“神经网络”的整车…...

实现Nginx的反向代理和负载均衡

一、反向代理和负载均衡简介 1.1、反向代理 反向代理(reverse proxy)指:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。此时代理服务器对外就表现为一个反向代理服务器。 反向代…...

【算法】子集

难度&#xff1a;中等 题目&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,…...

Web前端:HTML篇(一)

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器…...

ActiViz中的选择点vtkWorldPointPicker

文章目录 1. vtkWorldPointPicker简介2. 类的位置和继承关系3. 选择机制4. 返回的信息5. 选择的条件和参数6. 与屏幕空间选择器的比较7. 性能特征8. 应用场景9. 与其他vtk选择器的集成10. 完整示例总结1. vtkWorldPointPicker简介 vtkWorldPointPicker是Visualization Toolkit…...

如何开启或者关闭 Windows 安全登录?

什么是安全登录 什么是 Windows 安全登录呢&#xff1f;安全登录是 Windows 附加的一个组件&#xff0c;它可以在用户需要登录的之前先将登录界面隐藏&#xff0c;只有当用户按下 CtrlAltDelete 之后才出现登录屏幕&#xff0c;这样可以防止那些模拟登录界面的程序获取密码信息…...

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装&#xff0c;为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程&#xff0c;为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网&#xff1a;https://www.anaconda.com/ 另外&#…...

什么是离线语音识别芯片?与在线语音识别的区别

离线语音识别芯片是一种不需要联网和其他外部设备支持&#xff0c;‌上电即可使用的语音识别系统。‌它的应用场合相对单一&#xff0c;‌主要适用于智能家电、‌语音遥控器、‌智能玩具等&#xff0c;‌以及车载声控和一部分智能家居。‌离线语音识别芯片的特点包括小词汇量、…...

使用Diffusion Models进行街景视频生成

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;街景图生成相当有挑战性&#xff0c;目前的文本到视频的方法仅限于生成有限范围的场景的短视频&#xff0c;文本到3D的方法可以生成单独的对象但不是整个城市。除此之外街景图对一致性的要求相当高&#x…...

UFO:革新Windows操作系统交互的UI聚焦代理

人工智能咨询培训老师叶梓 转载标明出处 人机交互的便捷性和效率直接影响着我们的工作和生活质量。尽管现代操作系统如Windows提供了丰富的图形用户界面&#xff08;GUI&#xff09;&#xff0c;使得用户能够通过视觉和简单的点击操作来控制计算机&#xff0c;但随着应用程序功…...

scp免密复制文件

实现在服务器A和服务器B之间使用scp命令免密互相传输文件 1. 在服务器A中免密复制到服务器B 1.1 生成服务器A的公钥私钥 #在服务器A中执行 ssh-keygen -t rsa -P ""命令执行完毕会在服务器A的 ~/.ssh 目录下生成两个文件&#xff1a;id_rsa 和 id_rsa.pub 1.2 拷…...

Maven 的模块化开发示例

Maven 的模块化开发是一种非常有效的软件开发方式&#xff0c;它允许你将一个大型的项目分割成多个更小、更易于管理的模块&#xff08;modules&#xff09;。每个模块都可以独立地构建、测试和运行&#xff0c;这不仅提高了开发效率&#xff0c;也便于团队协作和项目的维护。以…...

通过QT进行服务器和客户端之间的网络通信

客户端 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network #网络通信greaterThan(QT_MAJOR_VERSION, 4): QT widg…...

【STM32 HAL库】DMA+串口

DMA 直接存储器访问 DMA传输&#xff0c;将数据从一个地址空间复制到另一个地址空间。-----“数据搬运工”。 DMA传输无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场&#xff0c;它是通过硬件为RAM和IO设备开辟一条直接传输数据的通道&#xff0c…...

C#类型基础Part2-对象判等

C#类型基础Part2-对象判等 参考资料引用类型判等简单值类型判等复杂值类型判等 参考资料 《.NET之美-.NET关键技术深入解析》 引用类型判等 先定义两个类型&#xff0c;它们代表直线上的一个点&#xff0c;一个是引用类型class&#xff0c;一个是值类型struct public class…...

13.CSS 打印样式表 悬停下划线动画

CSS 打印样式表 虽然我们不经常从网上实际打印内容,但打印样式表不应被忽视。它们可以用来确保你的网站内容以一种易读和适合打印的方式呈现。这里有一个简单的、独特的打印样式表,你可以用它作为自己的基础: media print {page {size: A4;}body {margin: 0;padding: 0;}body, …...

C#基础:数据库分表的好处和实现方式

一、分表的好处&#xff1a; 1.提升查询速度&#xff1a;分表筛选后再拼接&#xff0c;而不是查大表&#xff0c;速度会显著提升 2.管理容易&#xff1a;根据业务需求&#xff0c;通常会按照时间或者空间来分表 3.提高并发性&#xff1a;降低锁竞争和查询阻塞的风险&#xf…...

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…...

学习React(描述 UI)

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件。在本章…...

mysql字符类型字段设置默认值为当前时间

-- 2024-07-22 10:22:20 select (DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)); ALTER TABLE tablename MODIFY COLUNN CREATE_DATE varchar (23) DEFAULT(DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)) COMMENT "创建日期;...

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …...

Linux基于CentOS7【yum】【vim】的基础学习,【普通用户提权】

目录 yum生态 什么是yum yum是如何得知目标服务器的地址和下载链接 vim vim模式 命名模式 光标移动 插入模式 i键插 a键插 o键插 底行模式 批量化注释 批量化去注释 创建vim配置文件 例子 高亮功能&#xff1a; 缩进功能&#xff1a; 符号位自动补齐功能…...

盛元广通实验室自动化生物样本库质量控制管理系统

随着我国生物医学研究的不断深入和精准医疗的快速发展&#xff0c;对高质量生物样本的需求日益增长。近年来&#xff0c;我国生物样本库建设取得了显著进展。各级政府、高校和医院纷纷投入资源建设生物样本库&#xff0c;推动了生物样本资源的有效整合和利用。生物样本库的质量…...

Java | 自制AWT单词猜一猜小游戏(测试版)

目录 游戏标题 开发过程 开发想法 技术栈 代码呈现 导包 核心代码 游戏标题 探索知识的迷宫&#xff0c;体验自制AWT单词猜一猜小游戏 在数字时代&#xff0c;学习可以是多彩的&#xff0c;游戏可以是智慧的。我们自豪地推出“单词猜猜猜”是一款结合了教育与娱乐的自制…...

docker搭建ES 8.14 集群

参考&#xff1a;【docker搭建es8集群kibana】_docker 安装生产级 es 8.14 集群-CSDN博客 1、之前已搭建一台单机版的dockerES集群 参见 Elasticsearch docker 安装_docker 安装es8.14.3-CSDN博客 2、现在需要重新搭建为docker ES集群 准备新搭建3个点 一、准备工作 提前开…...

自定义特征的智能演进:Mojo模型中的动态特征选择控制

自定义特征的智能演进&#xff1a;Mojo模型中的动态特征选择控制 在机器学习领域&#xff0c;特征选择是提升模型性能和泛化能力的关键步骤。Mojo模型&#xff0c;作为一种高效的模型部署方式&#xff0c;其对特征的动态选择和控制能力是实现高级机器学习应用的重要特性。本文…...

一级做a视频在线观看网站/宁波网站seo公司

第一个QNX程序已经写完&#xff0c;测试了QNX应用的开发过程&#xff0c;开始写一些复杂一点点的程序。 最先想到的是获取键盘输入和通过控制台进行输出&#xff0c;这些都是当初学习C语言的时候必做的功课。 <wbr></wbr> 和标准的C语言一样&#xff0c;QNX C语…...

广西建设职业学院技术教务系统网站/2345浏览器

基于 Linux 系统的免费、开源&#xff0c;衍生出了多个不同的 Linux 版本&#xff0c;比如 Redhat、CentOS、Ubuntu、Debian 等。这些 Linux 发行版中&#xff0c;有些默认安装有 GDB 调试器&#xff0c;但有些默认不安装。 判断当前 Linux 发行版是否安装有 GDB 的方法也很简单…...

平度市城乡建设局网站/网络搭建的基本流程

手机 WPS 最大显示条数&#xff0c;建议是还是在电脑使用较高版本打开表格 更文件保存后缀...

商城网站制作报价/今日小说排行榜百度搜索榜

scan,single client access name。简单客户端连接名&#xff0c;这是一个唯一的名称&#xff0c;在整个公司网络内部唯一&#xff0c;并且在DNS中可以解析为三个ip地址&#xff0c;客户端连接的时候只需要知道这个名称&#xff0c;并连接即可。下面是我rac 环境中的hosts 。 […...

网站维护一般多久/百度小说风云榜2022

思路&#xff1a;利用列表存储 在使用reverse()函数。 a input().split() #输入字符和维度 li1 [] for i in range(int(a[1])):li1.append(input()) #将福字每一行的字符存入列表 s1 "".join(li1) #将福…...

网站内容建设机制/网页模板建站系统

HTML阶段一.学习准备知识 1.软件的介绍 软件分类:C/S B/S C客户端----S服务器 类型的软件 C/S软件的特点:有独立的客户端,由独立的客户端传递数据到指定的服务器. 例如:LOL 王者荣耀 QQ 微信 B浏览器—C服务器 类型的文件 B/S的特点:没有独立的客户端,通过浏览器,向服务器传递数…...