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新预览功能介绍的更多相关文章

  1. Mac预览怎么用 Mac预览功能实用技巧大全

    Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具 ...

  2. 分离与继承的思想实现图片上传后的预览功能:ImageUploadView

    本文要介绍的是网页中常见的图片上传后直接在页面生成小图预览的实现思路,考虑到该功能有一定的适用性,于是把相关的逻辑封装成了一个ImageUploadView组件,实际使用效果可查看下一段的git效果图 ...

  3. 微信小程序实现图片是上传、预览功能

    本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...

  4. JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)

    需要解决的问题有:本地图片如何在上传前预览.编辑:最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼 ...

  5. 【小月博客】用HTML5的File API做上传图片预览功能

    前段时间做了一个项目,涉及到上传本地图片以及预览的功能,正好之前了解过 html5(点击查看更多关于web前端的有关资源) 可以上传本地图片,然后再网上看了一些demo结合自己的需求,终于搞定了.(P ...

  6. JAVA图片批量上传JS-带预览功能

    这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 <!DOCTYPE html> <%@ taglib prefix=& ...

  7. [转帖]Windows 10新预览版上线:可直接运行任意安卓APP了

    Windows 10新预览版上线:可直接运行任意安卓APP了 http://www.pcbeta.com/viewnews-80316-1.html 今晨(3月13日),微软面向Fast Ring(快 ...

  8. 为Dynamics CRM注释的图片附件做个预览功能

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复163或者20151017可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM中注释可 ...

  9. 在Visual Studio 2019中开启预览功能

    在Visual Studio 2019 菜单 [工具] > [选项] > [环境] 下的预览功能页面焕然一新!我们介绍了预览功能页面,以便您可以轻松找到这些功能并能够控制其启用.新布局提供 ...

  10. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_12-课程预览功能开发-需求分析

    5 课程预览功能开发 5.1 需求分析 课程预览功能将使用cms系统提供的页面预览功能,业务流程如下: 1.用户进入课程管理页面,点击课程预览,请求到课程管理服务 2.课程管理服务远程调用cms添加页 ...

随机推荐

  1. 10分钟带你徒手做个Java线程池

    摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理. 本文分享自华为云社区<放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧>,作者:冰 ...

  2. HTML+CSS仿写的登录页面

    仿写的登录页面 使用HTML+CSS,感觉很简单,记录下 话不多说,直接上代码 <!DOCTYPE html> <html lang="en">     & ...

  3. springcloud~Sentinel

    介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 是面向分布式.多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由.流量控制.流量整形.熔断降级.系统自适 ...

  4. shell自动化脚本,启动、停止应用程序

    #!/usr/bin/env bash # 常量初始化 set_runtime_vars(){ # 日期时间 Now_Date=`date +"%Y-%m-%d %H:%M:%S" ...

  5. 2021-05-28:跳跃游戏 II。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可

    2021-05-28:跳跃游戏 II.给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.你的目标是使用最少的跳跃次数到达数组的最后一个位置.假设你总是 ...

  6. < Python全景系列-4 > 史上最全文件类型读写库大盘点!什么?还包括音频、视频?

    欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语言! 本文系列第四篇,介绍史上 ...

  7. 一篇文章告诉你什么是Java内存模型

    在上篇 并发编程Bug起源:可见性.有序性和原子性问题,介绍了操作系统为了提示运行速度,做了各种优化,同时也带来数据的并发问题, 定义 在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题. ...

  8. Python异步编程之web框架异步vs同步 无IO任务压测对比

    前言 在python编程中,通过协程实现的异步编程号称能够提高IO密集型任务的并发量.本系列比较web服务器同步框架和异步框架的性能差异,包括无IO接口和常见IO操作,如文件.mysql.redis等 ...

  9. 代码随想录算法训练营Day18 二叉树

    代码随想录算法训练营 代码随想录算法训练营Day18 二叉树| 513.找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构 ...

  10. 数据库SQL复习

    数据库SQL介绍 Def:SQL是一种极其高效的数据库系统语言:可以实现对数据库中的数据进行增删改查等操作 增加操作:使用create命令: 可以create table 可以create View ...