C# 12 预览版的新功能

作者:Kathleen Dollard
排版:Alan Wang

Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在,您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验性功能:拦截器。该功能允许生成器重新路由代码,例如提供特定于上下文的优化。最后,nameof 功能得到增强,您可以在更多的地方使用它。

安装最新的 Visual Studio 预览版或最新版本的 .NET SDK 来使用 C# 12 。将项目的语言版本设置为 preview,就可查看 C# 12 的功能:

<PropertyGroup><LangVersion>preview</LangVersion>
</PropertyGroup>

由于这是实验性的功能,所以拦截器需要在项目文件中添加一个附加标志。

nameof 访问实例成员

nameof 关键字现在可用于成员名称,如初始化器、静态成员以及属性:

internal class NameOf
{public string S { get; } = "";public static int StaticField;public string NameOfLength { get; } = nameof(S.Length);public static void NameOfExamples(){Console.WriteLine(nameof(S.Length));Console.WriteLine(nameof(StaticField.MinValue));}[Description($"String {nameof(S.Length)}")]public int StringLength(string s){ return s.Length; }
}

您可以在 C# 12 的新增功能中了解更多信息。

内联数组

InlineArrayAttribute 是在以前的 .NET 8 预览版中引入到运行时的。 这是一项高级功能,主要由编译器、.NET 库和其他一些库使用。 该属性标识了一种可被视为连续基元序列的类型,以实现高效、类型安全、越界安全的可索引/可切分内联数据。 .NET 库使用内联数组提高应用程序和工具的性能。

编译器创建不同的 IL 来访问内联数组。 这会导致一些限制,例如不支持列表模式。 在大多数情况下,您可以像访问其他数组一样访问内联数组。 不同的 IL 可以在不更改代码的情况下提高性能:

private static void InlineArrayAccess(Buffer10<int> inlineArray)
{for (int i = 0; i < 10; i++){inlineArray[i] = i * i;}foreach (int i in inlineArray){Console.WriteLine(i);}
}

对于内联数组,大多数人倾向于使用,而不是创建。 但是,了解事物的运作方式大有裨益。 内联数组速度很快,因为它们依赖于指定长度的精确布局。 内联数组是一种具有单个字段的类型,并用指定数组长度的 InlineArrayAttribute 进行标记。 在上一个示例中使用的类型中,由于属性参数,运行时会在 Buffer10<T> 中为10个元素创建存储空间:

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer10<T>
{private T _element0;
}

您可以在 C# 12的新增功能中了解更多信息。

拦截器

此预览版引入了一项名为拦截器的实验性功能。它适用于一些高级场景,特别是允许更好的提前编译(AOT)。作为 .NET 8 的实验部分,在未来版本中它可能会被更改或删除。因此,先不要在生产中使用这项功能。

拦截器允许将特定方法调用重新路由到不同的代码。属性指定实际的源代码位置,因此拦截器通常仅适用于源生成器。您可以阅读拦截器提案以了解有关拦截器如何工作的更多信息。

由于拦截器是一项实验性功能,因此您需要在项目文件中显式启用它们:

<PropertyGroup><Features>InterceptorsPreview</Features>
</PropertyGroup>

拦截器可以实现绝佳的代码模式。以下是一些例子:

  • 可以拦截编译时已知的调用,例如具有常量模式的 Regex.IsMatch(@"a+b+"),并使用静态生成的代码进行优化,以便更好地适用于提前编译(AOT)环境 。
  • 可以拦截诸如 app.MapGet("/products", handler: (int? page, int? pageLength, MyDb db) => { ... }) 之类的 ASP.NET Minimal API 调用来注册一个静态生成的 thunk,该 thunk 会直接调用用户的处理程序,从而跳过分配和间接。
  • 在矢量化中,foreach 循环包含对用户方法的调用,编译器可以重写代码以在运行时检查和使用相关的内部函数,但如果这些内部函数不可用,则返回到原始代码。
  • 依赖注入的静态依赖图解析,其中 provider.Register<MyService>() 可以被拦截。
  • 可以拦截对查询提供程序的调用,以在编译时提供对另一种语言(例如 SQL)的翻译,而不是评估表达式树以在运行时进行翻译。
  • 序列化器可以根据具体的调用类型(如 Serialize<MyType>())生成特定于类型的(反)序列化,所有这些都在编译时进行。

虽然大多数程序员不会直接使用拦截器,但我们仍希望它能够在开发中发挥重要作用,使您的应用程序更快运行并更易部署。拦截器预计在 C# 12/.NET 8 版本中仍保持实验阶段,并可能包含在 C# 的后续版本中。

总结

您可以在 Microsoft Learn 的 C# 12 新增功能页面上找到有关迄今为止引入的所有功能的更多信息,并在 Roslyn 功能状态页面上跟踪 C# 12 功能的演变。

您可以通过下载最新的 Visual Studio 预览版或最新版本的 .NET SDK 并在您的项目文件中将 LangVersion 设置 preview 来查看最新的 C# 12 功能。

请让我们知道您的想法!

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

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

相关文章

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

算法通关村第五关——n数之和问题解析

1. 两数之和问题 力扣第1题就是两数之和问题&#xff0c;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

Ishikawa

Ishikawa 石川、鱼骨头、因果 其实我压根不知道 Ishikawa 这个日文就是石川&#xff0c;^_^&#xff0c;视乎也没啥影响

计算机网络基础

文章目录 网络协议初识协议分层OSI七层模型TCP/IP五层协议 网络传输基本流程网络传输流程数据包装和分用封装过程分用过程 网络中的地址管理IP地址MAC地址 网络协议初识 协议是一种约定。 协议分层 分层之后&#xff0c;每一层只关注自己同层的功能&#xff0c;只使用下层的接…

卷积神经网络实现MNIST手写数字识别 - P1

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第P1周&#xff1a;实现mnist手写数字识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同…

【Hystrix技术指南】(1)基本使用和配置说明

这世间许多事物皆因相信而存在&#xff0c;所以人们亲手捏出了泥菩萨&#xff0c;却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被…

一个好的人力资源管理系统包括哪些部分

阅读本文&#xff0c;您将具体详细了解&#xff1a;一个好的人力资源管理系统应该包括哪些部分。 人事部门是一家公司重要的职能部门之一&#xff0c;为公司的持续性、健康性发展提供人力保障。 然而&#xff0c;目前传统的人事管理方式在应对一些问题时存在着一些挑战。 例…

Shell脚本学习-循环的控制命令

break continue exit对比&#xff1a; 示例1&#xff1a;break命令跳出整个循环。 [rootabc scripts]# cat break1.sh #!/bin/bashfor((i0;i<5;i)) doif [ $i -eq 3 ]thenbreakfiecho $i done echo "ok"[rootabc scripts]# sh break1.sh 0 1 2 ok可以看到i等于3及…

jupyter lab环境配置

1.jupyterlab 使用虚拟环境 conda install ipykernelpython -m ipykernel install --user --name tf --display-name "tf" #例&#xff1a;环境名称tf2. jupyter lab kernel管理 show kernel list jupyter kernelspec listremove kernel jupyter kernelspec re…

AttributeError: ‘NoneType‘ object has no attribute ‘flush‘

问题描述 当你的项目中使用了transformers库&#xff0c;并且使用 pyinstaller 打包无控制台窗口的程序时就会报这个错。 Traceback (most recent call last): File "main.py", line 4, in <module> File "<frozen importlib._bootstrap>", …

微信小程序--原生

1&#xff1a;数据绑定 1&#xff1a;数据绑定的基本原则 2&#xff1a;在data中定义页面的数据 3&#xff1a;Mustache语法 4&#xff1a;Mustache的应用场景 1&#xff1a;常见的几种场景 2&#xff1a;动态绑定内容 3&#xff1a;动态绑定属性 4&#xff1a;三元运算 4&am…

C语言:打开调用堆栈

第一步&#xff1a;打断点 第二步&#xff1a;FnF5 第三步&#xff1a;按如图找到调用堆栈

C 语言高级3--函数指针回调函数,预处理,动态库的封装

目录 1.函数指针和回调函数 1.1 函数指针 1.1.1 函数类型 1.1.2 函数指针(指向函数的指针) 1.1.3 函数指针数组 1.1.4 函数指针做函数参数(回调函数) 2.预处理 2.1 预处理的基本概念 2.2 文件包含指令(#include) 2.2.1 文件包含处理 2.2.2 #incude<>和#include&q…

Jmeter之BeanShell取出参数进行四则运算,并判断是否正确

首先调用余额接口&#xff0c;使用正则提取响应中的余额字段&#xff0c;记作变量acctBal1做支付交易再次调用余额接口&#xff0c;使用正则提取响应中的余额字段&#xff0c;记作变量acctBal2最后在结果树中可以看到断言错误的信息&#xff0c;断言正确时没有提示以下是beansh…

Elasticsearch使用中出现的错误

Elasticsearch使用中出现的错误 1、分页查询异常 在分页的过程中出现了一个问题是当查询的数据超过10000条的时候报了异常&#xff1a; from size must be less than or equal to: [10000]这个问题最快捷的解决方式是增大窗口大小&#xff1a; curl -XPUT http://127.0.0.…

全角字符和半角字符

全角字符的由来 全角符号是双字节中文编码的历史遗留问题。当年在纯文本的界面中&#xff0c;为了让西文和中日韩的方块字对齐&#xff0c;就让西文字母、数字和标点也占用一个汉字的视觉空间&#xff0c;并使用 2 个字节存储。后来&#xff0c;其中的一些全角字符因为比较有用…

C++ 线性群体的概念

线性群体中的元素次序与其位置关系是对应的。 在线性群体中&#xff0c;可以按照访问元素的不同方法分为直接访问、顺序访问和索引访问。 &#xff08;1&#xff09;直接访问 对可直接访问的线性群体&#xff0c;我们可以直接访问群体中的任何一个元素&#xff0c;而不必首先访…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

修改 Ubuntu 系统的时区

修改 Ubuntu 系统的时区 如果 Ubuntu 系统的时区设置不正确&#xff0c;您可以按照以下步骤进行调整&#xff1a; 1. 查看当前的时区设置&#xff0c;可以使用以下命令&#xff1a; timedatectl 这将显示当前系统的日期、时间和时区信息。 2. 如果时区设置不正…

252_BOOST_线程中的定时器使用,使用【Boost.Asio类】来完成这个异步操作,从而不影响线程中的其他操作

大致整体解读 这段代码使用了 Boost 库的一些功能,主要集中在 Boost.Asio 部分。下面我会详细解释每个使用到的 Boost 函数的功能。boost::asio::io_context: 这是 Boost.Asio 提供的核心类,用于实现异步 I/O 操作和事件驱动编程。它提供了事件循环机制,可以处理异步操作、…