C# 12 预览版的新功能

这篇具有很好参考价值的文章主要介绍了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 功能。

请让我们知道您的想法!文章来源地址https://www.toymoban.com/news/detail-628035.html

到了这里,关于C# 12 预览版的新功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 今天新发布的nova12手机都有哪些新功能?

    12月26日,华为召开问界M9及华为冬季全场景发布会,正式推出了华为nova 12系列新品,并宣布新的三款nova产品正式加入先锋计划~我们一起看下这次华为nova12系列有那些看点亮点呢?首先这次nova12 ultra 配置很高啊,智能可变光圈,双向北斗卫星消息,智感支付、智能快充10分钟快

    2024年02月03日
    浏览(34)
  • 三星泄露微软 Copilot 新功能:用自然语言操控各种功能

    3 月 11 日消息,微软计划本月晚些时候发布新款 Surface 电脑和适用于 Windows 11 的 Copilot 新功能,但三星似乎等不及了,在其即将推出的 Galaxy Book4 系列产品宣传材料中泄露了一些即将到来的 Copilot 功能。 三星官网上发布的图片证实了此前关于微软正为其人工智能助手 Copilo

    2024年04月09日
    浏览(70)
  • Visual Studio 2022的一个惊艳新功能开发隧道

    在visual studio开发H5网站的调试时候,需要在多环境调试,比如在不同浏览器和不同分辨率的电脑、不同的手机浏览器测试。或者项目比较着急,需要边测试边开发,可不可以不发布让测试人员来测试呢?visual studio 2022在17.5版本推出了开发隧道(Dev Tunnels)的功能,就是可以解

    2024年02月06日
    浏览(35)
  • 借助生成式 AI 提升鸿蒙 APP 开发体验?试试 AutoDev 新功能

    生成式 AI 在软件研发和知识管理上,有着非常大的潜力,也因此这项技术被越来越多的企业所采用。而在一些新兴的技术上,诸如于鸿蒙操作系统,它带来了一些新 的理念、开发工具 DevEco Studio、新的语言 ArkTS、新的 UI 框架 ArkUI 等等。从模式上来说,它与生成式 AI 结合企业

    2024年04月25日
    浏览(25)
  • Python网页应用开发神器fac 0.2.6版本重要新功能一览

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components ,欢迎star支持 大家好我是费老师,距离我的开源 Python 网页应用通用组件库 fac 的 0.2.0 版本发布已过去半个多月的时间,在国内外众多 fac 用户的反馈建议下,经过高强度的优化和功能更新,目前 fac 已经更新到 0.2.6 版本

    2024年02月02日
    浏览(73)
  • 前端食堂技术周刊第 93 期:7 月登陆 Web 平台的新功能、Node.js 工具箱、Nuxt3 开发技巧、MF 重构方案

    美味值:🌟🌟🌟🌟🌟 口味:橙橙冰萃美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下上周的技术资讯。 Deno 八月更新 Deno 1.36 更灵活的权限控制、Deno Deploy 可过滤、搜索的持久化日志、Fresh 1.3 路由

    2024年02月13日
    浏览(33)
  • C++11 新功能

    在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为 C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没 有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C+

    2023年04月12日
    浏览(37)
  • Java 20 新功能介绍

    Java 20 共带来 7 个新特性功能 ,其中三个是孵化提案,孵化也就是说尚在征求意见阶段,未来可能会删除此功能。 JEP 描述 分类 429 作用域值(孵化器) Project Loom,Java 开发相关 432 Record 模式匹配(第二次预览) Project Amber,新的语言特性 433 switch 的模式匹配(第四次预览)

    2024年02月03日
    浏览(47)
  • 【C++】C++11 -- 新功能

    在C++11之前一个类有6个默认成员函数,在C++11标准中又新增了两个默认成员函数,分别是移动构造函数和移动赋值函数 默认移动构造和移动赋值生成的条件 移动构造函数的生成条件:没有自己实现移动构造函数,并且没有自己实现析构函数,拷贝构造函数和拷贝赋值函数 移

    2024年02月17日
    浏览(33)
  • Midjourney新功能:角色参照指南

    基本概念 角色参照(Character Reference) :这个功能允许用户在不同的图像生成中保持给定参照角色的一致性。 适用模型 :适用于Midjourney V6和Niji6型号。 功能亮点 跨风格一致性 :可以在不同风格(如动漫风、写实风)中保持角色特征一致。 面部、着装、发型调控 :用户可以

    2024年04月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包