C# 12新预览功能介绍
Visual Studio 17.7 Preview 3和.NET 8 Preview 6延续了C# 12的发展。该预览版包含的功能旨在为未来的性能增强奠定基础。对内联数组的轻松访问将允许库在更多地方使用它们,而无需您花费精力。该预览版首次推出了名为拦截器(interceptors)的实验性功能,允许生成器重新路由代码,例如提供上下文特定的优化。
可以通过安装最新的 Visual Studio 预览版或最新版本的 .NET SDK 来获取 C# 12。若要使用 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; }
}
内联数组(Inline Arrays)
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;
}
拦截器(Interceptors)
本次发布的预览版引入了一项叫做interceptors(拦截器)的新功能。这项新功能主要用于一些高级场景,尤其是将会带来更好的AOT编译能力。作为.NET 8的实验性功能,在未来的版本中有可能被修改甚至删除,因此,它不应该在生产环境中使用。
拦截器是一种方法,该方法可以在编译时以声明方式将对可拦截方法的调用替换为对其自身的调用。 通过让拦截器声明所拦截调用的源位置,可以进行这种替换。 此过程可以向编译中(例如在源生成器中)添加新代码,从而提供更改现有代码语义的有限能力。
在源生成器中使用拦截器修改现有编译的代码,而非向其中添加代码。 源生成器将对可拦截方法的调用替换为对拦截器方法的调用。
由于拦截器是一项实验性功能,因此需要在项目文件中显式启用它们:
<PropertyGroup>
<Features>InterceptorsPreview<Features>
</PropertyGroup>
拦截器支持令人兴奋的代码模式。
- 在编译时已知的调用,如带有常量模式的
Regex.IsMatch(@"a+b+"),可以被拦截,以使用静态生成的代码进行优化,这对AOT是友好的。 - ASP.NET最小API调用,如
app.MapGet("/products", handler: (int? page, int? pageLength, MyDb db) => { ... })可以被拦截以注册一个静态生成的thunk,该thunk直接调用用户的处理程序,跳过分配和间接寻址。 - 在矢量化中,foreach循环包含对用户方法的调用,编译器可以重写代码,在运行时检查并使用相关的内在函数,但如果这些内在函数不可用,则返回到原始代码。
- 静态依赖关系图解析用于依赖注入,其中
provider.Register<MyService>()可被拦截。 - 可以拦截对查询提供者的调用,以便在编译时将其翻译为另一种语言(例如SQL),而不是在运行时评估表达式树以进行翻译。
- 序列化器可在编译时根据具体类型的调用(如
Serialize<MyType>())生成特定类型的(反)序列化。
大多数程序员不会直接使用拦截器,但我们希望拦截器将在我们的开发过程中发挥重要作用,使您的应用程序运行更快,更易于部署。在C# 12/.NET 8版本中,拦截器预计仍将是试验性的,并可能包含在未来的C#版本中。
C# 12新预览功能介绍的更多相关文章
- Mac预览怎么用 Mac预览功能实用技巧大全
Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具 ...
- 分离与继承的思想实现图片上传后的预览功能:ImageUploadView
本文要介绍的是网页中常见的图片上传后直接在页面生成小图预览的实现思路,考虑到该功能有一定的适用性,于是把相关的逻辑封装成了一个ImageUploadView组件,实际使用效果可查看下一段的git效果图 ...
- 微信小程序实现图片是上传、预览功能
本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...
- JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)
需要解决的问题有:本地图片如何在上传前预览.编辑:最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼 ...
- 【小月博客】用HTML5的File API做上传图片预览功能
前段时间做了一个项目,涉及到上传本地图片以及预览的功能,正好之前了解过 html5(点击查看更多关于web前端的有关资源) 可以上传本地图片,然后再网上看了一些demo结合自己的需求,终于搞定了.(P ...
- JAVA图片批量上传JS-带预览功能
这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 <!DOCTYPE html> <%@ taglib prefix=& ...
- [转帖]Windows 10新预览版上线:可直接运行任意安卓APP了
Windows 10新预览版上线:可直接运行任意安卓APP了 http://www.pcbeta.com/viewnews-80316-1.html 今晨(3月13日),微软面向Fast Ring(快 ...
- 为Dynamics CRM注释的图片附件做个预览功能
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复163或者20151017可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM中注释可 ...
- 在Visual Studio 2019中开启预览功能
在Visual Studio 2019 菜单 [工具] > [选项] > [环境] 下的预览功能页面焕然一新!我们介绍了预览功能页面,以便您可以轻松找到这些功能并能够控制其启用.新布局提供 ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_12-课程预览功能开发-需求分析
5 课程预览功能开发 5.1 需求分析 课程预览功能将使用cms系统提供的页面预览功能,业务流程如下: 1.用户进入课程管理页面,点击课程预览,请求到课程管理服务 2.课程管理服务远程调用cms添加页 ...
随机推荐
- 为什么C++语言性能优越?
面试时被问到这个问题,发现自己一直以来理所当然的认为C++快,却没有具体分析原因.下面简单总结一下为什么快. 当我们编写程序时,我们需要将程序转换为计算机可以理解的机器语言.不同的语言有不同的执行机制 ...
- C51笔记-郭天祥-第二章 从点灯大师开始
第2章 Keil软件的使用及流水灯设计 Keil的用法:用Keil建立工程: 工程配置: C51单片机程序软件仿真.单步.全速.断点设置和变量查看等: 用一个完整的C51程序操控LED亮灭: 调用库 ...
- OpenAI的子词标记化神器--tiktoken 以及 .NET 支持库SharpToken
OpenAI在其官方GitHub上公开了一个开源Python库:tiktoken,这个库主要是用力做字节编码对的. 字节编码对(Byte Pair Encoder,BPE)是一种子词处理的方法.其主要 ...
- OpenAI的离线音频转文本模型 Whisper 的.NET封装项目
whisper介绍 Open AI在2022年9月21日开源了号称其英文语音辨识能力已达到人类水准的Whisper神经网络,且它亦支持其它98种语言的自动语音辨识. Whisper系统所提供的自动语音 ...
- 我的第一个项目(十二) :分数和生命值的更新(后端增删查改的"改")
好家伙,写后端,这多是一件美逝. 关于这个项目的代码前面的博客有写 我的第一个独立项目 - 随笔分类 - 养肥胖虎 - 博客园 (cnblogs.com) 现在,我们登陆进去了,我开始和敌人战斗,诶 ...
- windows 添加应用的临时签名
我们需要给应用添加数字签名,比如沃通.DigiCert. 申请购买代码签名证书需要一段时间,或者个人开发的应用签名,所以我们需要临时证书. 打开VS-工具-命令行,下面是添加过程 1. 创建一个测试证 ...
- Python-zmail发送简单邮件
简介: Zmail 使得在python3中发送和接受邮件变得更简单.你不需要手动添加服务器地址.端口以及适合的协议,zmail会帮你完成.此外,使用一个python字典来代表邮件内容也更符合直觉 安装 ...
- unity运行时调试log控制台
最近从GameFramework把里头觉得很赞的Debugger调试器单独抽离了出来,方便嵌入任意项目工程进行调试. 查看log信息,允许点击详情并复制到粘贴板,允许锁定log滚动面板 支持开启log ...
- Redis数据结构一之对象的介绍及各版本对应实现
本文首发于公众号:Hunter后端 原文链接:Redis数据结构一之对象的介绍及各版本对应实现 本篇笔记开始介绍 Redis 数据结构的底层实现. 当我们被问到 Redis 中有什么数据结构,或者说数 ...
- Selenium - 基础知识介绍
Selenium - 基础知识介绍 介绍 Selenium是ThoughtWorks员工在业余时间开发并维护的开源项目,并且在ThoughtWorks的项 目中被广泛应用. 简单地说,Selenium ...