C# 12 中的新增功能

本文内容

  1. 主构造函数
  2. 集合表达式
  3. ref readonly 参数
  4. 默认 Lambda 参数

显示另外 5 个

C# 12 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 8 SDK 尝试这些功能。

  • 主构造函数 - 在 Visual Studio 2022 版本 17.6 预览版 2 中引入。

  • 集合表达式 - 在 Visual Studio 2022 版本 17.7 预览版 5 中引入。

  • 内联数组 - 在 Visual Studio 2022 版本 17.7 预览版 3 中引入。

  • Lambda 表达式中的可选参数 - 在 Visual Studio 2022 版本 17.5 预览版 2 中引入。

  • ref readonly 参数 - 在 Visual Studio 2022 版本 17.8 预览版 2 中引入。

  • 任何类型的别名 - 在 Visual Studio 2022 版本 17.6 预览版 3 中引入。

  • 实验属性 - 已在 Visual Studio 2022 版本 17.7 预览版 3 中引入。

  • 拦截器 - 预览功能 在 Visual Studio 2022 版本 17.7 预览版 3 中引入。

主构造函数

现在可以在任何 class 和 struct 中创建主构造函数。 主构造函数不再局限于 record 类型。 主构造函数参数都在类的整个主体的范围内。 为了确保显式分配所有主构造函数参数,所有显式声明的构造函数都必须使用 this() 语法调用主构造函数。 将主构造函数添加到 class 可防止编译器声明隐式无参数构造函数。 在 struct 中,隐式无参数构造函数初始化所有字段,包括 0 位模式的主构造函数参数。

编译器仅在 record 类型(record class 或 record struct 类型)中为主构造函数参数生成公共属性。 对于主构造函数参数,非记录类和结构可能并不总是需要此行为。

有关主构造函数的详细信息,请参阅探索主构造函数的教程和实例构造函数的相关文章。

集合表达式

集合表达式引入了新的 terse 语法来创建常见的集合值。 可以使用展开运算符 .. 将其他集合内联到这些值中。

可以创建多个类似集合的类型,而无需使用外部 BCL 支持。 这些类型包括:

  • 数组类型,例如 int[]
  • System.Span<T> 和 System.ReadOnlySpan<T>。
  • 支持集合初始值设定项的类型,例如 System.Collections.Generic.List<T>。

以下示例演示了集合表达式的使用:

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];// Create a list:
List<string> b = ["one", "two", "three"];// Create a span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素。 参数必须是集合类型。 以下示例演示了展开运算符的工作原理:

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

展开运算符的操作数是可以枚举的表达式。 展开运算符可计算枚举表达式的每个元素。

可以在需要元素集合的任何位置使用集合表达式。 它们可以指定集合的初始值,也可以作为参数传递给采用集合类型的方法。 可以在有关集合表达式的语言参考文章或功能规范中详细了解集合表达式。

ref readonly 参数

C# 添加了 in 参数作为传递只读引用的方法。 in 参数既允许变量和值,并且无需对参数进行任何注释即可使用。

添加 ref readonly 参数可以更清楚地了解可能使用 ref 参数或 in 参数的 API:

  • 即使参数未修改,在 in 引入之前创建的 API 也可能会使用 ref。 可以使用 ref readonly 更新这些 API。 对于调用方来说,这不会是一项中断性变更,就像参数 ref 更改为 in 那样。 示例为 System.Runtime.InteropServices.Marshal.QueryInterface。
  • 采用 in 参数但逻辑上需要变量的 API。 值表达式不起作用。 示例为 System.ReadOnlySpan<T>.ReadOnlySpan<T>(T)。
  • 使用 ref 的 API,因为它们需要变量,但不改变该变量。 示例为 System.Runtime.CompilerServices.Unsafe.IsNullRef。

若要了解有关 ref readonly 参数的详细信息,请参阅有关语言参考中的参数修饰符的文章,或参考只读参数功能规范。

默认 Lambda 参数

现在可以为 Lambda 表达式的参数定义默认值。 语法和规则与将参数的默认值添加到任何方法或本地函数相同。

可以在有关 Lambda 表达式的文章中详细了解 Lambda 表达式上的默认参数。

任何类型的别名

可以使用 using 别名指令创建任何类型的别名,而不仅仅是命名类型。 这意味着可以为元组类型、数组类型、指针类型或其他不安全类型创建语义别名。 有关详细信息,请参阅功能规范。

内联数组

运行时团队和其他库作者使用内联数组来提高应用的性能。 内联数组使开发人员能够创建固定大小的 struct 类型数组。 具有内联缓冲区的结构应提供类似于不安全的固定大小缓冲区的性能特征。 你可能不会声明自己的内联数组,但当它们从运行时 API 作为 System.Span<T> 或 System.ReadOnlySpan<T> 对象公开时,你将透明地使用这些数组。

内联数组的声明类似于以下 struct

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{private int _element0;
}

它们的用法与任何其他数组类似:

var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{buffer[i] = i;
}foreach (var i in buffer)
{Console.WriteLine(i);
}

区别在于编译器可以利用有关内联数组的已知信息。 你可能会像使用任何其他数组一样使用内联数组。 有关如何声明内联数组的详细信息,请参阅有关 struct 类型的语言参考。

Experimental 属性

可以使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 来标记类型、方法或程序集,以指示实验性特征。 如果访问使用 ExperimentalAttribute 注释的方法或类型,编译器将发出警告。 用 Experimental 特性标记的程序集中包含的所有类型都是实验性的。 可以在有关编译器读取的常规属性的文章或功能规范中阅读详细信息。

拦截器

 警告

拦截器是一项试验性功能,在 C# 12 的预览模式下提供。 在将来的版本中,该功能可能会发生中断性变更或被删除。 因此,不建议将其用于生产或已发布的应用程序。

若要使用拦截器,用户项目必须指定属性 <InterceptorsPreviewNamespaces>。 这是允许包含拦截器的命名空间的列表。

例如:<InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

拦截器是一种方法,该方法可以在编译时以声明方式将对可拦截方法的调用替换为对其自身的调用。 通过让拦截器声明所拦截调用的源位置,可以进行这种替换。 拦截器可以向编译中(例如在源生成器中)添加新代码,从而提供更改现有代码语义的有限能力。

在源生成器中使用拦截器修改现有编译的代码,而非向其中添加代码。 源生成器将对可拦截方法的调用替换为对拦截器方法的调用。

如果你有兴趣尝试拦截器,可以阅读功能规范来了解详细信息。 如果使用该功能,请确保随时了解此实验功能的功能规范中的任何更改。 最终确定功能后,我们将在本站点上添加更多指导。

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

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

相关文章

ThreeJs同一个场景多个相机的显示

在threeJs开发数字孪生中&#xff0c;我们正常是需要使用一个相机&#xff0c;画面显示的内容也就是这个相机拍摄到的内容&#xff0c;但是是否可以添加多个相机&#xff0c;可以同时从不同角度观察模型呢&#xff0c;实际上是可以的&#xff0c;不过多个相机的拍摄到的画面肯定…

Linux uname命令教程:了解系统信息和配置(附实例详解和注意事项)

Linux uname命令介绍 uname&#xff08;Unix Name&#xff09;命令用于显示系统信息&#xff0c;包括内核名称、网络节点名称、操作系统名称、版本号、硬件名称和处理器类型。它是一个基本的系统管理工具&#xff0c;通常用于识别系统配置。 Linux uname命令适用的Linux版本 …

Linux服务:Nginx反向代理与负载均衡

一、Nginx反向代理 1、什么是反向代理&#xff1f; 代理分为两类&#xff0c;正向代理和反向代理。 ①正向代理&#xff1a;帮助用户访问服务器&#xff0c;缓存服务器内容。 ②反向代理&#xff1a;代理服务器处理用户的请求&#xff0c;决定转发请求给谁处理负载均衡的作…

Go 与 Rust:导航编程语言景观

在当今构建软件时&#xff0c;开发者在编程语言上有着丰富的选择。两种脱颖而出的语言是 Go 和 Rust - 都很强大但却截然不同。本文将从各种因素比较这两种语言&#xff0c;以帮助您确定哪种更适合您的需求。 我们将权衡它们在并发、安全性、速度、互操作性等方面的方法。我们将…

Ubuntu篇——crontab修改编辑器

输入命令: crontab -e 如果你的系统是第一次使用crontab服务&#xff0c;会首先让你选择一个编辑器 如果已经选择过编辑器&#xff0c;后续想要修改默认编辑器&#xff0c;可以输入sudo select-editor进行修改。

【GPU驱动开发】-GPU架构简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理单元&#xff09;是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 一、总体流程 应…

Node.js基础---Express中间件

1. 概念 1.什么是中间件 中间件(Middleware)&#xff0c;特指业务流程的中间处理环节 2. Express 中间件的调用流程 当一个请求到达 Express 的服务器后&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理 3. Express 中间件格式 Express 的中间件&…

每周一算法:双端队列广搜

题目链接 电路维修 题目描述 达达是来自异世界的魔女&#xff0c;她在漫无目的地四处漂流的时候&#xff0c;遇到了善良的少女翰翰&#xff0c;从而被收留在地球上。翰翰的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障&#xff0c;导致无法启动。 电路板的整体结…

Java实战:SpringBoot集成ZXing实现二维码生成与解析

一、引言 在信息化社会&#xff0c;二维码已经深入到生活的各个角落&#xff0c;无论是支付、营销、信息传递&#xff0c;甚至防伪溯源&#xff0c;二维码都发挥了至关重要的作用。作为Java开发者&#xff0c;我们如何在SpringBoot项目中便捷地实现二维码的生成与解析呢&#…

4、Redis-Set【常用】

目录 一、Redis-Set特点 二、常用命令与交并差 三、Redis中Set类型应用场景 一、Redis-Set特点 1、无序&#xff1a;添加的是A,B,C&#xff1b;取出的可能是B,A,C 2、唯一&#xff1a;不允许元素重复 二、常用命令与交并差 常用命令 格式含义例子sadd key members[...]往k…

吴恩达机器学习笔记十四 多输出的分类 多类和多标签的区别 梯度下降优化 卷积层

这里老师想讲的是multiclass classification和multilable classification的区别&#xff0c;下面是我从其他地方找到的说法: Multiclass classification 多类分类 意味着一个分类任务需要对多于两个类的数据进行分类。比如&#xff0c;对一系列的橘子&#xff0c;苹果或者梨的…

Stable Diffusion生成式扩散模型代码实现原理

Stable Diffusion可以使用PyTorch或TensorFlow等深度学习框架来实现。这些框架提供了一系列的工具和函数&#xff0c;使得开发者可以更方便地构建、训练和部署深度学习模型。因此可以使用PyTorch或TensorFlow来实现Stable Diffusion模型。 安装PyTorch&#xff1a;确保您已经安…

Linux命令行与shell脚本编程大全-2.2

第二部分 shell脚本编程基础 第11章构建基础脚本 第12章结构化命令 第13章更多的结构化命令 第14章处理用户输入 第15章呈现数据 第16章脚本控制 第15章 呈现数据 15.1 理解输入和输出 15.1.1 标准文件描述符 Linux 系统会将每个对象当作文件来处理&#xff0c;这包括输入和…

T3SF:一款功能全面的桌面端技术练习模拟框架

关于T3SF T3SF是一款功能全面的桌面端技术练习模拟框架&#xff0c;该工具针对基于主场景事件列表的各种事件提供了模块化的架构&#xff0c;并包含了针对每一个练习定义的规则集&#xff0c;以及允许为对应平台参数定义参数的配置文件。 该工具的主模块能够执行与其他特定模…

CDN原理探究

来源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通过上图&#xff0c;我们可以了解到&#xff0c;使用了CDN缓存后的网站的访问过程变为&#xff1a; 用户向浏览器提供要访问的域名&#xff…

幻兽帕鲁/Palworld服务器的最佳网络设置、内存和CPU配置是什么?

幻兽帕鲁/Palworld服务器的最佳网络设置、内存和CPU配置是什么&#xff1f; 对于4到8人的玩家&#xff0c;推荐的配置是4核16G的CPU和16G的内存。10到20人的玩家选择8核32G的CPU和32G或以上的内存。2到4人的玩家则建议选择4核8G的CPU和8G的内存。对于32人的玩家&#xff0c;推…

YOLOV8介绍

原文链接&#xff1a; 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署&#xff08;实战&#xff09;&#xff08;&#xff09;有具体部署和训练实现代码YOLOV8模型训练部署&#xff08;实战&#xff09;&…

Mybatis plus核心功能-IService

目录 1 前言 2 使用方法 2.1 继承ServiceImpl,> 2.2 基础业务开发的使用 2.3 复杂业务开发的使用 2.3 Lambda查询 2.4 Lambda更新 1 前言 我本以为Mapper层的类能够继承BaseMapper<XXX>&#xff0c;而不用我们手动写一些mapper方法已经够离谱了。没想到海油膏…

linux上pip3 install torch==1.11和pip3 install torch==1.11+cu115区别

在linux上安装torch时&#xff0c; 如果环境安装好了CUDA环境&#xff0c; 那么安装torch时不用刻意指定带cuda的版本&#xff0c; 最终安装的也是支持GPU的torch版本。但是仍然有一些小的区别&#xff0c;主要就是支持CUDA版本的不同。 (leo_py37) pinefieldedge-gpu-01:/dat…

Gradle构建项目

1.自己下载对应的gradle版本到本地。 2.maven国内镜像&#xff08;settings.gradle中进行配置&#xff09; // google()maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repository/google/}maven { url https://maven.aliyu…