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 功能。
请让我们知道您的想法!
相关文章:
C# 12 预览版的新功能
作者:Kathleen Dollard 排版:Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在,您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验…...
34.利用matlab解 多变量多目标规划问题(matlab程序)
1.简述 学习目标:适合解 多变量多目标规划问题,例如 收益最大,风险最小 主要目标法,线性加权法,权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) ; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…...
暑假刷题第18天--7/30
165. 小猫爬山 - AcWing题库(dfs) #include<iostream> #include<string> #include<bitset> #include<cstring> #include<algorithm> using namespace std; const int N18; bool vis[N]; int a[N],n,ans,sum[N],k; bool cmp(int x,int y){retur…...
通向架构师的道路之Apache整合Tomcat
一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…...
如何消除“信息孤岛”对业务增长的威胁?
根据CMSWire的数据,员工平均每天要花36%的时间来查找和整合信息。但44%的情况下,他们找不到信息。这种时间和精力的浪费就是信息孤岛造成的。 什么是信息孤岛? 当部门存储数据并限制其他人访问数据时,就会出现信息孤岛ÿ…...
Kali部署dvwa和pikachu靶场
kali换源 进入 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib替换完后更新源 apt-get upadteDVWA靶场环境搭建 使用git从github上把DV…...
LeetCode解法汇总722. 删除注释
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给一个 C 程序,删除程序中的注释。这个程序source是一个数组&#x…...
Linux中的firewall-cmd
2023年8月4日,周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务?为什么会有服务?打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones࿰…...
python 最大归一化
最大归一化是将数据转化到[-1,1]范围之间。公式如下 其中|X|max为x特征的绝对值的最大值。 数据标准化算法介绍—数据建模工具_预处理_Max_字段 """ 最大绝对值归一化(max abs normalization ):也就是将数值变为单位长度&…...
Netty:ByteBuf写入数据、读出数据
介绍 Netty的ByteBuf数据位置索引是0开始的。 可以用ByteBuf的getByte(int index)方法从指定位置读出一字节,这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0,或者index 1大于ByteBuf的容量,就会抛出IndexO…...
C++(15):面向对象程序设计
面向对象程序设计概述 面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。 1.使用数据抽象,可以将类的接口与实现分离; 2.使用继承,可以定义相似的类型并对其相似关系建模&#x…...
2023牛客暑期多校训练营6-A Tree
2023牛客暑期多校训练营6-A Tree https://ac.nowcoder.com/acm/contest/57360/A 文章目录 2023牛客暑期多校训练营6-A Tree题意解题思路代码 题意 解题思路 最大价值和这个数据范围,一眼 d p dp dp。 直接在树上并不好处理,问题是如何有效转化、处理…...
Vc - Qt - QPainter::SmoothPixmapTransform及QPainter::Antialiasing
QPainter::SmoothPixmapTransform是一个标志,用于指定绘制操作中的平滑像素变换行为。当使用QPainter绘制一幅图像时,设置SmoothPixmapTransform标志可以使图像变换过程更加平滑,减少锯齿状边缘的出现。此标志通常用于绘制缩放后图像的情况。…...
【练习】条件变量:创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC
题目: 创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC......要求使用条件变量 #include <stdio.h> #include <pthread.h> #include <unistd.h>//创建互斥锁 pthread_mutex_t mutex PTHREAD_MUTE…...
SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)
初衷 💢初衷💢 因为一遍遍修改并重启项目觉得很麻烦,所以刚开始就自己给项目配置了热加载,但奈何代码更新还是慢,还不如我重启一遍项目的速度,所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…...
clear_data_code_2d_model
dev update off () dev close window () ImageFiles:-./二维条码/read_image(Image,ImageFiles 十二维条码原图.png)dev_open_window_fit_image(Image,0,0,-,-1,WindowHandle)set_display_font (WindowHan…...
“深入剖析JVM:揭秘Java虚拟机的工作原理“
标题:深入剖析JVM:揭秘Java虚拟机的工作原理 摘要:本文将深入探讨Java虚拟机(JVM)的工作原理,包括JVM的架构、内存管理、垃圾回收、即时编译等关键技术。通过对JVM的剖析,我们可以更好地理解Ja…...
elementui表格table中实现内容的换行
问题 elementui 中的 table 行内的内容不能进行换行。 解决方法 思路: 利用 作用域插槽 结合 v-html,通过作用域插槽传递内容到表格行内,再通过 v-html 进行内容的替换。 代码: <el-table:data"tableData"stri…...
java 框架
目录 Spring 如何解决 bean 的循环依赖?什么是 AOP?Spring 如何实现的?BeanFactory 和 ApplicationContext 有什么区别?介绍一下 Spring bean 的生命周期Spring 的隔离级别Spring 框架用到了哪些设计模式?并举出典型例子Spring 如何解决 bean 的循环依赖? Spring中引入三…...
死锁的发生原因和怎么避免
项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 死锁,简单来说就是两个或者两个以上的线程在…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
