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

C# 11 中的新增功能

本文内容

  1. 泛型属性
  2. 泛型数学支持
  3. 数值 IntPtr 和 UIntPtr
  4. 字符串内插中的换行符

显示另外 11 个

C# 11 中增加了以下功能:

  • 原始字符串字面量
  • 泛型数学支持
  • 泛型属性
  • UTF-8 字符串字面量
  • 字符串内插表达式中的换行符
  • 列表模式
  • 文件本地类型
  • 必需的成员
  • 自动默认结构
  • 常量 string 上的模式匹配 Span<char>
  • 扩展的 nameof 范围
  • 数值 IntPtr
  • ref 字段和 scoped ref
  • 改进了方法组向委托的转换
  • 警告波 7

.NET 7 支持 C# 11。 有关详细信息,请参阅 C# 语言版本控制。

可以通过 .NET 下载页下载最新 .NET 7 SDK。 还可以下载 Visual Studio 2022,其中包括 .NET 7 SDK。

 备注

我们有兴趣了解你对这些功能的反馈。 如果发现这些新功能存在问题,请在 dotnet/roslyn 存储库中创建新问题。

泛型属性

可以声明基类为 的泛型类。 此功能为需要 System.Type 参数的属性提供了更方便的语法。 以前需要创建一个属性,该属性将 Type 作为其构造函数参数:

C#复制

// Before C# 11:
public class TypeAttribute : Attribute
{public TypeAttribute(Type t) => ParamType = t;public Type ParamType { get; }
}

并且为了应用该属性,需要使用 typeof 运算符:

C#复制

[TypeAttribute(typeof(string))]
public string Method() => default;

使用此新功能,可以改为创建泛型属性:

C#复制

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

然后指定类型参数以使用该属性:

C#复制

[GenericAttribute<string>()]
public string Method() => default;

应用属性时,必须提供所有类型参数。 换句话说,泛型类型必须完全构造。 在上面的示例中,可以省略空括号 (( 和 )),因为特性没有任何参数。

C#复制

public class GenericType<T>
{[GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.public string Method() => default;
}

类型参数必须满足与 typeof 运算符相同的限制。 不允许使用需要元数据注释的类型。 例如,不允许将以下类型用作类型参数:

  • dynamic
  • string?(或任何可为 null 的引用类型)
  • (int X, int Y)(或使用 C# 元组语法的任何其他元组类型)。

这些类型不会直接在元数据中表示出来。 它们包括描述该类型的注释。 在所有情况下,都可以改为使用基础类型:

  • object(对于 dynamic)。
  • string,而不是 string?
  • ValueTuple<int, int>,而不是 (int X, int Y)

泛型数学支持

有几个语言功能支持泛型数学支持:

  • static virtual 接口中的成员
  • 已检查的用户定义的运算符
  • 宽松移位运算符
  • 无符号右移运算符

可以在接口中添加 static abstract 或 static virtual 成员,以定义包含可重载运算符、其他静态成员和静态属性的接口。 此功能的主要场景是在泛型类型中使用数学运算符。 例如,可以在实现 operator + 的类型中实现 System.IAdditionOperators<TSelf, TOther, TResult> 接口。 其他接口定义其他数学运算或明确定义的值。 可以在有关接口的文章中了解新语法。 包含 static virtual 方法的接口通常是泛型接口。 此外,大部分将声明一个约束,即类型参数实现声明接口。

可以在探索静态抽象接口成员教程或 .NET 6 中的预览功能 - 泛型数学博客文章中了解详细信息并亲自尝试该功能。

泛型数学对语言创建了其他要求。

  • 无符号右移运算符:在 C# 11 之前,若要强制无符号右移,需要将任何带符号整数类型强制转换为无符号类型,执行移动,然后将结果强制转换回带符号类型。 从 C# 11 开始,可以使用 >>>无符号移动运算符。
  • 宽松的移动运算符要求:C# 11 删除了第二个操作数必须是 int 或隐式转换为 int 的要求。 此更改允许在这些位置使用实现泛型数学接口的类型。
  • 已检查和未检查的用户定义运算符:开发人员现在可以定义 checked 和 unchecked 算术运算符。 编译器根据当前上下文生成对正确变体的调用。 有关 checked 运算符的详细信息,可以阅读有关算术运算符的文章。

数值 IntPtr 和 UIntPtr

现在 nint 和 nuint 类型的别名分别为 System.IntPtr 和 System.UIntPtr。

字符串内插中的换行符

字符串内插的 { 和 } 字符内的文本现在可以跨多个行。 { 和 } 标记之间的文本分析为 C#。 允许任何合法 C#(包括换行符)。 使用此功能可以更轻松地读取使用较长 C# 表达式的字符串内插,例如模式匹配 switch 表达式或 LINQ 查询。

可以在语言参考的字符串内插文章中了解有关换行符功能的详细信息。

列表模式

列表模式扩展了模式匹配,以匹配列表或数组中的元素序列。 例如,当 sequence 为数组或三个整数(1、2 和 3)的列表时,sequence is [1, 2, 3] 为 true。 可以使用任何模式(包括常量、类型、属性和关系模式)来匹配元素。 弃元模式 (_) 匹配任何单个元素,新的范围模式 (..) 匹配零个或多个元素的任何序列。

可以在语言参考的模式匹配文章中了解有关列表模式的更多详细信息。

改进了方法组向委托的转换

方法组转换上的 C# 标准现在包含以下项:

  • 允许转换(但不是必需的)以使用已包含这些引用的现有委托实例。

以前版本的标准禁止了编译器重用为方法组转换而创建的委托对象。 C# 11 编译器缓存从方法组转换创建的委托对象,并重用该单个委托对象。 此功能最初在 Visual Studio 2022 版本 17.2 中作为预览功能提供,在 .NET 7 预览版 2 中首次提供。

原始字符串文本

原始字符串字面量是字符串字面量的一种新格式。 原始字符串字面量可以包含任意文本,包括空格、新行、嵌入引号和其他特殊字符,无需转义序列。 原始字符串字面量以至少三个双引号 (""") 字符开头。 它以相同数量的双引号字符结尾。 通常,原始字符串字面量在单个行上使用三个双引号来开始字符串,在另一行上用三个双引号来结束字符串。 左引号之后、右引号之前的换行符不包括在最终内容中:

C#复制

string longMessage = """This is a long message.It has several lines.Some are indentedmore than others.Some should start at the first column.Some have "quoted text" in them.""";

右双引号左侧的任何空格都将从字符串字面量中删除。 原始字符串字面量可以与字符串内插结合使用,以在输出文本中包含大括号。 多个 $ 字符表示有多少个连续的大括号开始和结束内插:

C#复制

var location = $$"""You are at {{{Longitude}}, {{Latitude}}}""";

前面的示例指定了两个大括号开始和结束内插。 第三个重复的左大括号和右大括号包括在输出字符串中。

可以在编程指南中关于字符串的文章中,以及关于字符串字面量和内插字符串的语言参考文章中详细了解原始字符串字面量。

自动默认结构

C# 11 编译器可以确保在执行构造函数的过程中,将 struct 类型的所有字段初始化为其默认值。 此更改意味着,任何未由构造函数初始化的字段或自动属性都由编译器自动初始化。 现在,构造函数未明确分配所有字段的结构可以进行编译,并且未显式初始化的任何字段都设置为其默认值。 有关此更改如何影响结构初始化的详细信息,请阅读有关结构的文章。

常量 string 上的模式匹配 Span<char> 或 ReadOnlySpan<char>

你已经能够在几个版本中使用模式匹配来测试 string 是否有某个特定的常量值。 现在,可以将同一模式匹配逻辑用于 Span<char> 或 ReadOnlySpan<char> 的变量。

扩展的 nameof 范围

在该方法的属性声明中的 nameof 表达式中使用时,类型参数名称和参数名称现在处于范围内。 此功能意味着可以使用 nameof 运算符在方法或参数声明的属性中指定方法参数的名称。 此功能最常用于为可为空分析添加属性。

UTF-8 字符串字面量

可以对字符串字面量指定 u8 后缀来指定 UTF-8 字符编码。 如果应用程序需要 UTF-8 字符串,则对于 HTTP 字符串常量或类似的文本协议来说,可以使用此功能来更轻松地创建 UTF-8 字符串。

有关 UTF-8 字符串字面量的详细信息,请参阅关于内置引用类型的文章的字符串字面量部分。

必需的成员

可以将 required 修饰符添加到属性和字段,以强制构造函数和调用方初始化这些值。 可以将 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 添加到构造函数,以通知编译器构造函数将初始化所有必需的成员。

有关所需成员的详细信息,请参阅属性文章的仅限初始化部分。

ref 字段和 ref scoped 变量

可以在 ref struct 中声明 ref 字段。 这支持没有特殊特性或隐藏的内部类型的 System.Span<T> 等类型。

可向任意 ref 声明添加 scoped 修饰符。 这限制了可将引用转义到的范围。

文件本地类型

从 C# 11 开始,可以使用 file 访问修饰符创建其可见性范围限定为其声明时所在的源文件的类型。 此功能可帮助源生成器创建者避免命名冲突。 可以在语言参考中有关文件范围类型的文章中详细了解此功能。

相关文章:

C# 11 中的新增功能

本文内容 泛型属性泛型数学支持数值 IntPtr 和 UIntPtr字符串内插中的换行符 显示另外 11 个 C# 11 中增加了以下功能&#xff1a; 原始字符串字面量泛型数学支持泛型属性UTF-8 字符串字面量字符串内插表达式中的换行符列表模式文件本地类型必需的成员自动默认结构常量 str…...

Postman通用接口加密解决方案

前言&#xff1a; 很对小伙伴对于psotman接口加密不知道如何解决&#xff0c;这里给大家出了一个全网最详细的解决方案&#xff0c;希望能帮助到大家 问题 postman内置加密Api&#xff0c;但不支持RSA加解密码。如何用postman进入rsa加解密&#xff1f;postman中request对象…...

java,钉钉小程序免密登录

一、开发者后台统一登录 - 钉钉统一身份认证 登录钉钉开放平台 二、教程介绍 如何实现用户免登。免登是指用户进入应用后&#xff0c;无需输入钉钉用户名和密码&#xff0c;应用程序可自动获取当前用户身份&#xff0c;进而登录系统的流程。 三、准备工作 注册了钉钉管理员…...

基于docker部署的Selenium Grid分布式自动化测试

01、什么是Selenium Grid Selenium Grid是Selenium套件的一部分&#xff0c;它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍&#xff0c;因为Selenium团队已经逐渐遗弃老版…...

目标和——力扣494

文章目录 题目描述解法:动态规划题目描述 解法:动态规划 nt findTargetSumWays(vector<int>& nums, int target){int sum...

sql 执行的顺序

在执行 SQL 查询时&#xff0c;通常会按照以下顺序进行处理&#xff1a; FROM 子句&#xff1a;指定要查询的表或视图。WHERE 子句&#xff1a;筛选满足特定条件的行。GROUP BY 子句&#xff1a;将结果按照指定的列进行分组。HAVING 子句&#xff1a;筛选满足特定条件的分组。…...

TCP收发信息(C++)

目录 一、介绍 二、收数据 三、发数据 一、介绍 tcp和udp的区别之一&#xff0c;即tcp是有连接的&#xff0c;udp是无连接的&#xff0c;udp收发数据的代码可以独立运行&#xff0c;tcp发数据前必须确保收数据的一方是打开的&#xff0c;否则无法建立连接。 二、收数据 tc…...

windows Socket简单编程实例

服务端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…...

外企开展中国在线业务的三种网络加速方案:含免ICP备案CDN解决方案

中国作为全球除美国外最大的消费市场&#xff0c;是几乎每个国际化企业都想要深入挖掘的市场&#xff0c;但外国企业在中国开展在线业务需要面临一个比较特殊的挑战&#xff1a;互联网防火墙&#xff08;GFW&#xff09;。为此所有想要在中国市场有所作为的外企都需要首先解决这…...

室内UWB定位到达角(AOA)测量精度的提高

抽象的 本文表明,用于在视线 (LoS) 中定位标签的干涉定位系统的方位角测量精度可以通过利用脉冲无线电超宽带 (IR-UWB) 信号来提高,并且无需增加频率带宽。该解决方案采用相位相关 (PC) 方法,最初应用于连续波 (CW) 信号,后来适用于超宽带 (UWB) 脉冲信号。将获得的结果与…...

“深入理解JVM:探索Java虚拟机的内部工作原理“

标题&#xff1a;深入理解JVM&#xff1a;探索Java虚拟机的内部工作原理 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部工作原理&#xff0c;包括JVM的架构、类加载、内存管理、垃圾回收机制等方面。通过理解JVM的内部工作原理&#xff0c;我们…...

TC3XX - MCAL知识点(三十一):FlsLoader MCAL配置及代码实战

目录 1、概述 2、MCAL配置 2.1、FlsLoaderGeneral 2.2、FlsLoaderOptionalApi 2.3、FlsLoaderPFlash0ProtConfig 3、测试代码及结果 3.1、测试代码 3.1.1、初始化 3....

Yii2 mongodb分组查询

$data MongoDbModelName::getCollection()->aggregate([[$group > [_id > $user_id, //通过user_id分组去重total > [$sum > 1]],],[$match > [total > [$gt > 1]]]],[allowDiskUse > true]);相当于 select user_id,count(1) as total from Mongo…...

Springboot的多种部署方式和Linux具体的 service 操作介绍

前言 Springboot 内置了 tomcat&#xff0c;部署十分的方便&#xff0c;无需额外的应用服务器。但是在部署过程中&#xff0c;却有很多种方式 本文总结在工作中常见的 linux 部署方式 一、通过nohup命令部署 linux 可以通过 nohup 命令将项目部署在后台&#xff0c;即使终端…...

【EI/SCOPUS检索】2023年第二届光学成像与测量国际会议 (ICOIM2023)

2023年第二届光学成像与量国际会议 &#xff08;ICOIM2023&#xff09; 2023 2nd International Conference on Optical Imaging and Measurement 光学成像与测量密切相关且具有广泛的应用&#xff0c;如显微镜、望远镜、传感器等。通常&#xff0c;成像是测量的基础&#xf…...

6 个简单步骤,教你创建可视化看板工作流

看板是一种相当流行的工作管理工具&#xff0c;团队和组织使用它来可视化工作流程&#xff0c;限制当前正在进行的工作&#xff0c;并最大限度地提高流程效率。 看板的一些主要特点包括&#xff1a; ✓ 看板提供了对工作流程进行可视化控制的手段&#xff1b; ✓ 看板 "…...

时间相减 示例kotlin LocalDateTime

时间相减 示例kotlin LocalDateTime fun test1(){val d1: LocalDateTime LocalDateTime.parse("2023-05-06 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))val d2: LocalDateTime LocalDateTime.parse("2023-05-07 15:12:00"…...

Boost开发指南-4.5swap

swap boost::swap是对标准库里的std::swap 的增强和泛化&#xff0c;为交换两个变量&#xff08;可以是int等内置数据类型&#xff0c;或者是类实例、容器&#xff09;的值提供了便捷的方法。 为了使用boost::swap&#xff0c;需要包含头文件<boost/swap.hpp>&#xff…...

OpenStack对接Ceph平台

OpenStack对接Ceph平台 目录 OpenStack对接Ceph平台 1、创建后端需要的存储池(ceph-01节点操作)2、创建后端用户 2.1 创建密钥(ceph-01节点操作) 2.1.1 创建用户client.cinder2.1.2 创建用户client.glance2.1.3 创建用户client.cinder-backup2.2 导出密钥(ceph-01节点操作)2.3 …...

【Vue2】动态组件的使用-切换组件和keep-alive,以及异步组件

目录 想实现切换不同列表展示不同数据方法一方法二&#xff0c;动态组件动态组件的父组件如何传的值动态组件的子组件如何接受传的值 认识keep-alive缓存组件的生命周期 异步组件&#xff0c;单独打包&#xff0c;实现webpack分包&#xff0c;如何对组件进行单独打包&#xff0…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...