首页 > 编程语言 >C# 12新预览功能介绍

C# 12新预览功能介绍

时间:2023-07-13 10:45:06浏览次数:47  
标签:拦截器 预览 C# 调用 12 数组 内联 NET

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,数组,内联,NET
From: https://www.cnblogs.com/zhaorong/p/17549762.html

相关文章

  • Scala连接Hbase集群出现异常tried to access method com.google.common.base.Stopwatc
    总结/朱季谦在新项目上创建以下Scala代码去连接Hbase集群,用来判断Hbase是否存在某张表。//离线Hbasevalconf:Configuration=HBaseConfiguration.create()conf.set("hbase.zookeeper.quorum","192.168.1.200")conf.set("hbase.zookeeper.property.clientPort","2181&......
  • 强化学习Chapter2——优化目标(1)
    强化学习Chapter2——优化目标(1)上节涉及强化学习基本思路以及利用数学方式表征强化学习,但对强化学习的目标并没有进行详尽的定义。本节的目标旨在介绍algorithm-free的优化目标,即本文将不涉及算法地详述强化学习的目标。强化学习一般性目标上文提到,强化学习的目标可以解释为:......
  • 关于ChatGPT与机器伦理学
    关于ChatGPT与机器伦理学机器人这一概念,最初不是出自计算机科学家或工程师之手,而是来自于捷克的戏剧家卡雷尔·恰佩克(KarlCapek)在1920年编排的一出名为“罗森的全能机器人”的舞台剧中。直到了1960年,随着美国的约瑟夫·恩格伯格(JosephEngelberger)创办了人类历史上的第一......
  • IIS部署createWebHistory路由模式的Vue项目
    接口使用NetCore,前端使用Vue3.+网站部署目录如下api(虚拟应用程序)webindex.html需要在服务器上按照URLRewrite下载地址:https://www.iis.net/downloads/microsoft/url-rewrite安装后在网站根目录下创建“web.config”文件,内容如下<?xmlversion="1.0"encoding="UTF-8"?......
  • 【Python】数据可视化利器PyCharts在测试工作中的应用
    PyCharts简介PyCharts是一个基于Python的数据可视化库,它支持多种图表类型,如折线图、柱状图、饼图等。PyCharts提供了简洁的API,使得用户能够轻松地创建各种图表,同时支持个性化的配置,以满足不同需求。PyCharts的底层依赖于ECharts,这使得它在功能和性能上都具有很高的优势。......
  • 利用远程调试获取Chromium内核浏览器Cookie
    前言本文将介绍不依靠DPAPI的方式获取Chromium内核浏览器Cookie远程调试首先我们以edge为例。edge浏览器是基于Chromium的,而Chromium是可以开启远程调试的,开启远程调试的官方文档如下:https://blog.chromium.org/2011/05/remote-debugging-with-chrome-developer.htmlchrome......
  • 解决curios的具体操作步骤
    Curios-一个有趣的Python库![Curios](Curios是一个有趣的Python库,它为我们提供了一种简单而强大的方式来探索和发现一些有趣的事物。无论是数学、科学、历史,还是文化,Curios都可以帮助我们解开其中的谜团。Curios的安装非常简单,只需在终端中运行以下命令:pipinstallcurios......
  • [Vue] 使用pdf-lib和@pdf-lib/fontkit 报错 fontkit.create is not a function
    描述:pdf-lib注册了@pdf-lib/fontkit后(pdfDoc.registerFontkit(fontkit)),内部调用了fontkit的create方法,但是这个方法不存在。我在控制台打印了下fontkit对象,发现fontkit包了一层default,即 fontkit.default.create(),所以找不到这个方法, pdf-lib使用的是 fo......
  • 2021 robocom 世界机器人开发者大赛-本科组(初赛)
    7-1懂得都懂题目描述:7-1懂的都懂众所周知,在互联网上有很多话是不好直接说出来的,不过一些模糊的图片仍然能让网友看懂你在说什么。然而对这种言论依然一定要出重拳,所以请你实现一个简单的匹配算法。现在我们采集了原图的一些特征数据,由N个小于255的非负整数组成,假设对于......
  • 阿里云容蓓:DCDN 助力云原生时代的应用构建及最佳实践
    在数字化转型速度不断提升的今天,大带宽、低时延、高并发的场景不断涌现,内容分发网络(ContentDeliveryNetwork,CDN)应用需求还在不断攀升,打造更高质量的CDN服务将成为新时代产业竞争的关键所在。亚太CDN峰会自2012年第一届以来,转眼已经过了11年,而今正值中国CDN发展十年转型期,提升C......