当前位置: 首页 > 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…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...