首页 > 编程语言 >C# 12 中的新增功能

C# 12 中的新增功能

时间:2024-02-19 15:02:06浏览次数:24  
标签:12 C# 新增 int 拦截器 参数 集合 表达式 构造函数

C# 12 中的新增功能

 

本文内容

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

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

主构造函数

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

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

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

集合表达式

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

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

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

C#
// 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];

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

C#
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:

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

默认 Lambda 参数

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

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

任何类型的别名

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

内联数组

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

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

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

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

C#
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>

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

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

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

另请参阅

标签:12,C#,新增,int,拦截器,参数,集合,表达式,构造函数
From: https://www.cnblogs.com/sexintercourse/p/18021100

相关文章

  • Office Online Server Windows Server 2016 部署
    一、准备“武器”本文是通过虚拟机搭建OOS测试环境的,4567是3的前提,武器提取le731、VMWareWorkstation17Player2、WindowsServer2016镜像(需要OfficeOnlineServer2017年4月或更高版本)3、OfficeOnlineServer2016(简称OOS)4、NETFramework4.5.2(NDP452-KB2901......
  • itchat保存接收到的图片
    importitchatfromitchat.contentimportTEXT,MAP,CARD,NOTE,SHARING,PICTURE,RECORDING,ATTACHMENT,VIDEO,FRIENDS,SYSTEM#下载文件到本地defdownload_files(msg):msg.download("C:\\360demo\\"+msg['FileName'])#itchat.send......
  • P1012 [NOIP1998 提高组] 拼数
    题目 源代码一、错误示范1//去比较最高位数字的大小,大的在前面(ASCII比较)2//使用字符串存储多个数字3#include<iostream>4#include<algorithm>5usingnamespacestd;6structstu7{8strings;9}student[25];10boolcmp(stua,stub)11{......
  • 2024-02-18-物联网C语言(8-结构体、共用体、枚举)
    8.结构体、共用体、枚举8.1结构体的概念和定义8.1.1基本概述构造类型:不是基本类型的数据结构也不是指针,它是若干个相同或不同类型的数据构成的集合。常用的构造类型有数组、结构体、共用体。数组用于保存多个相同类型的数据结构体用于保存多个不同类型的数据8.1.2概......
  • 设置使用Pycharm创建py文件时,自动在文件里添加固定格式的注释
    当创建新的py文件时,希望文件头能够生成注释具体做法:1.打开pycharm,找到setting选项 2.点击setting,选择左侧fileandcodetemplates,然后点击pythonscript,在右侧空白部分填入所需的模版。点击apply、点击ok即可。  3.模版案例 #-*-coding:utf-8-*-#************......
  • VC++ 中 CT2A CA2T 两个宏进行字符串转换简单测试
    #include"afxwin.h"#include<iostream>usingnamespacestd;intmain(){CStringcs=_T("西游记");AfxMessageBox(_T("CString:")+cs);//CString转ACSIICT2Aa_str(cs);stringstd_str(a_str);......
  • code: 'ERR_OSSL_EVP_UNSUPPORTED' 报错解决
    报错:Error:error:0308010C:digitalenveloperoutines::unsupportedatnewHash(node:internal/crypto/hash:69:19)atObject.createHash(node:crypto:133:10)atBulkUpdateDecorator.hashFactory(D:\WzProject\wz-middle-ground-frontend\node_module......
  • 唯一客服系统:Golang开发客服系统源码,支持网页,H5,APP,微信小程序公众号等接入,商家有PC端
    本系统采用GolangGin框架+GORM+MySQL+Vue+ElementUI开发的独立高性能在线客服系统。客服系统访客端支持PC端、移动端、小程序、公众号中接入客服,利用超链接、网页内嵌、二维码、定制对接等方式让网上所有通道都可以快速通过本系统联系到商家。 服务端可编译为二进制程序包,无......
  • KY78 最大上升子序列和C++
    这个解决问题的思路使用动态规划,即用已知状态去得到未知状态。思路逻辑是这样sum[i]记录以A[i]为末上升子序列的和的最大值然后从j从0-i-1遍历如果A[j]<A[i]那么sum[i]=sum[j]+A[i];然后找出sum[i]中的的最大值,就是以A[i]为末上升子序列的和的最大值。这样就实现了从前......
  • css样式相关代码记录
    element样式穿透:::v-deepposition属性值有static、relative、absolute、fixed、sticky。static:该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。relative:该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会......