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. 【Vue项目】商品汇前台(一)组件拆分+请求封装

    写在最前面 之前学完vue基础之后,一直想做一下前端的项目,但是自己写了一点前后端分离的项目发现自己前端写的是真的乱,所以趁着假期的空闲做一下尚硅谷商品汇的前后台项目,争取这周写完前台,然后这个月再写 ...

  2. Semantic Kernel 入门系列:🍋Connector连接器

    当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果.这一过程在Semantic Kern ...

  3. 什么是BFC,BFC的作用,以及怎么触发BFC

    什么是BFC: 块级格式化上下文 BFC的作用: BFC其实就是规定了网页布局的规范     1.BFC就是页面上的一个独立容器,容器里面的元素不会影响到外面的元素     解释:BFC的基本改变,最 ...

  4. 实现声明式锁,支持分布式锁自定义锁、SpEL和结合事务

    目录 2.实现 2.1 定义注解 2.2 定义锁接口 2.3 锁的实现 2.3.1 什么是SPI 2.3.2 通过SPI实现锁的多个实现类 2.3.3 通过SPI自定义实现锁 3.定义切面 3.1 切 ...

  5. C# 强行关闭其他软件对文件的占用

    using System.Diagnostics; // 获取占用文件的进程并强制结束 public void CloseProcessByFileName(string fileName) { Pr ...

  6. 机器学习(七):梯度下降解决分类问题——perceptron感知机算法与SVM支持向量机算法进行二维点分类

    实验2 感知机算法与支持向量机算法 一.预备知识 1.感知机算法 二.实验目的 掌握感知机算法的原理及设计: 掌握利用感知机算法解决分类问题. 三.实验内容 设计感知机算法求解, 设计SVM算法求解( ...

  7. 解决Godot使用VsCode编写C#代码,智能提示不见了[一问随笔]

    问题: 我的项目采用了godot + visual studio code + C#,有天突然换引擎,从Godot4.0.0升级到Godot4.0.2,visual studio code 突然不给代 ...

  8. SQL Server 2005递归查询

    WHIT XXX(列1,列2....) AS ( SELECT 列1,列2... FROM 表WHERE ID=xxxxxx UNION ALL SELECT 列1,列2.... FROM 表 WHE ...

  9. 2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限

    2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"], ...

  10. 2021-11-21:map[i][j] == 0,代表(i,j)是海洋,渡过的话代价是2, map[i][j] == 1,代表(i,j)是陆地,渡过的话代价是1, map[i][j] == 2,代表

    2021-11-21:map[i][j] == 0,代表(i,j)是海洋,渡过的话代价是2, map[i][j] == 1,代表(i,j)是陆地,渡过的话代价是1, map[i][j] == 2,代表 ...