.NET 8.0中有哪些新的变化?

1 性能提升
.net 8 在整个堆栈中带来了数千项性能改进 。默认情况下会启用一种名为动态配置文件引导优化 (pgo) 的新代码生成器,它可以根据实际使用情况优化代码,并且可以将应用程序的性能提高高达 20%。现在支持的 avx-512 指令集能够对 512 位数据向量执行并行操作,这意味着可以在更短的时间内处理更多的数据。原始类型(数字及其他类型)现在实现了新的可格式化和可解析接口,这使它们能够直接格式化和解析为 utf-8,而无需任何转码开销。
2.net aspire
.net aspire 是一个用于使用 .net 构建弹性、可观察和可配置的云原生应用程序的堆栈。它包括一组针对云原生而增强的精选组件,默认情况下包括遥测、弹性、配置和运行状况检查。结合复杂而简单的本地开发人员体验,.net aspire 可以在第 1 天和第 100 天轻松发现、获取和配置云原生应用程序的基本依赖项。
3.net 8 容器增强功能 – 更安全、更紧凑、更高效
使用 .net 比以往更轻松、更安全地使用容器打包应用程序。每个 .net 映像都包含一个非 root 用户,从而通过单行配置启用更安全的容器。.net sdk 工具无需 dockerfile 即可发布容器映像,并且默认情况下是非 root 的。由于 .net 基础映像更小,因此可以更快地部署容器化应用程序 - 包括我们映像的新实验变体,这些变体可为本机 aot 提供真正最小的应用程序大小。选择使用新的 chiseled ubuntu 映像变体进行更多安全强化,以进一步减少攻击面。使用 dockerfile 或 sdk 工具,为任何架构构建应用程序和容器映像。
4 原生 aot – 迈向更高密度可持续计算的旅程
无需等待 jit(即时)编译器在运行时编译代码。无需部署 jit 编译器和 il 代码。aot 应用程序仅部署应用程序所需的代码。应用程序现在可以在不允许使用 jit 编译器的受限环境中运行。
5 人工智能 – 将 ai 融入您的 .net 应用程序
生成式人工智能和大型语言模型正在改变人工智能领域,使开发人员能够在其应用程序中创建独特的人工智能体验。.net 8 可以通过 .net sdk 中一流的开箱即用 ai 功能以及与多种工具的无缝集成来轻松利用 ai。 .net 8 为该 库带来了多项增强功能,以提高其与生成式 ai 工作负载的兼容性,例如集成 tensor primitives。随着人工智能应用程序的兴起,新的工具和 sdk 出现了。我们与众多内部和外部合作伙伴合作,例如 azure openai、azure cognitive search、milvus、qdrant 和 microsoft teams,以确保 .net 开发人员可以通过各自的 sdk 轻松访问各种 ai 模型、服务和平台。此外,开源语义内核 sdk 简化了这些 ai 组件与新的和现有应用程序的集成,以帮助您提供创新的用户体验。system.numerics 现在提供各种示例和参考模板,展示模式和实践,以便开发人员轻松入门:
客户聊天机器人
检索增强生成
使用 azure ai 服务开发应用程序
6 blazor – 使用 .net 构建全栈 web 应用程序
.net 8 中的 blazor 可以同时使用服务器和客户端来处理您的所有 web ui 需求。这是全栈 web ui!通过专注于优化页面加载时间、可扩展性和提升用户体验的多项新增强功能,开发人员现在可以在同一应用程序中使用 blazor server 和 blazor webassembly,在运行时自动将用户从服务器转移到客户端。得益于新的基于 “jiterpreter” 的运行时和新的内置组件,您的 .net 代码在 webassembly 上的运行速度显着加快。作为增强.net 8 中整体身份验证、授权和身份管理的一部分,blazor 现在支持生成完整的基于 blazor 的身份 ui。
7 net maui – 提升性能、可靠性和开发人员体验
.net maui 提供单一项目系统和单一代码库来构建 winui、mac catalyst、ios 和 android 应用程序。本机 aot(实验性)现在支持针对类似 ios 的平台。适用于 .net maui 的新 visual studio code 扩展为您提供了开发跨平台 .net 移动和桌面应用程序所需的工具。现在支持 xcode 15 和 android api 34,允许您瞄准最新版本的 ios 和 android。在性能、控件和 ui 元素以及特定于平台的行为方面进行了大量的质量改进,例如桌面交互添加了更好的点击处理、键盘侦听器等。
8 c# 12 功能 – 简化语法以提高开发人员的工作效率 c# 12 让您的编码体验更加高效和愉快。现在,您可以使用简单而优雅的语法在任何类和结构中创建主构造函数。不再需要样板代码来初始化您的字段和属性。使用简洁且富有表现力的语法创建数组、跨度和其他集合类型时会感到高兴。对 lambda 表达式中的参数使用新的默认值。不再需要重载或空检查来处理可选参数。您甚至可以使用 usingalias 指令为任何类型添加别名,而不仅仅是命名类型! 8.1 集合表达式 在 c# 12 之前,创建集合需要针对不同场景使用不同的语法。初始化所需的与 or 不同的语法。以下是创建集合的几种方法:listint [] span
int[] x1 = new int[] { 1, 2, 3, 4 };int[] x2 = array.empty();writebytearray(new[] { (byte)1, (byte)2, (byte)3 });list x4 = new() { 1, 2, 3, 4 };span dates = stackalloc datetime[] { getdate(0), getdate(1) };writebytespan(stackalloc[] { (byte)1, (byte)2, (byte)3 });8.2 任何类或结构上的主构造函数 c# 12 扩展了主构造函数以适用于所有类和结构,而不仅仅是记录。主构造函数允许在声明类时定义构造函数参数:public class bankaccount(string accountid, string owner){ public string accountid { get; } = accountid; public string owner { get; } = owner; public override string tostring() => $account id: {accountid}, owner: {owner};}主构造函数参数最常见的用途是: 作为 base () 构造函数调用的参数。
初始化成员字段或属性。
在实例成员中引用构造函数参数。
删除依赖注入中的样板。
8.3 别名任意类型 别名类型是从代码中删除复杂类型签名的便捷方法。using 从 c# 12 开始,其他类型在别名指令中有效。例如,这些别名在早期版本的 c# 中无效:
using intarray = int[]; // array types.using point = (int x, int y); // tuple typeusing unsafe arrayptr = int*; // pointer type (requires unsafe)8.4 默认 lambda 参数 从 c# 12 开始,您可以在 lambda 表达式中声明默认参数:var incrementby = (int source, int increment = 1) => source + increment;console.writeline(incrementby(5)); // 6console.writeline(incrementby(5, 2)); // 78.5 内联数组 运行时团队和其他库作者使用内联数组来提高应用的性能。 内联数组使开发人员能够创建固定大小的 struct 类型数组。 具有内联缓冲区的结构应提供类似于不安全的固定大小缓冲区的性能特征。 你可能不会声明自己的内联数组,但当它们从运行时 api 作为 system.span 或 system.readonlyspan 对象公开时,你将透明地使用这些数组。[system.runtime.compilerservices.inlinearray(10)]public struct buffer{ private int _element0;} 它们的用法与任何其他数组类似:
var buffer = new buffer();for (int i = 0; i hello world!);app.run();public class myoptions{ public int a { get; set; } public string s { get; set; } public byte[] data { get; set; } public dictionary values { get; set; } public list values2 { get; set; }}public class myclass{ public int somethingelse { get; set; }}11 针对 android 应用的 aot 编译 为了减小应用大小,面向 android 的 .net 和 .net maui 应用在发布模式下构建时使用分析的预先 (aot) 编译模式。 与常规 aot 编译相比,分析的 aot 编译所影响的方法更少。 .net 8 引入了 属性,你可使用它进一步对 android 应用进行 aot 编译,从而更进一步减少应用大小。 true 默认情况下,将 androidstripilafteraot 设置为 true 会替代默认的 androidenableprofiledaot 设置,从而允许剪裁已 aot 编译的(几乎)所有方法。 还可通过将两个属性都显式设置为 true 来结合使用分析的 aot 和 il 条带化:
true true12 代码分析 .net 8 包括几个新的代码分析器和修复程序,可帮助验证是否正确且高效地使用 .net 库 api。 下表总结了新的分析器 规则 id 类别 说明
ca1856 性能 未在参数上正确应用 constantexpectedattribute 属性时触发。
ca1857 性能 当参数使用 constantexpectedattribute 添加批注但提供的参数不是常量时触发。
ca1858 性能 若要确定字符串是否以给定前缀开头,最好调用 string.startswith,而不是调用 string.indexof,然后将结果与零进行比较。
ca1859 性能 此规则建议尽可能将特定局部变量、字段、属性、方法参数和方法返回类型从接口或抽象类型升级到具体类型。 使用具体类型可生成更高质量的代码。
ca1860 性能 若要确定集合类型是否具有任何元素,最好使用 length、count 或 isempty,而不是调用 enumerable.any。
ca1861 性能 重复调用时,不会重复使用作为参数传递的常量数组,这意味着每次都会创建一个新数组。 若要提高性能,请考虑将数组提取到静态只读字段。
ca1865-ca1867 性能 对于单字符串,char 重载的性能更好。
ca2021 可靠性 enumerable.cast(ienumerable) 和 enumerable.oftype(ienumerable) 需要兼容的类型才能正常运行。 泛型类型不支持扩大转换和用户定义的转换。
ca1510-ca1513 可维护性 在构造新的异常实例方面,引发帮助程序比 if 块更简单、更高效。 这四个分析器是为以下例外情况创建的:argumentnullexception、argumentexception、argumentoutofrangeexception 和 objectdisposedexception。
13 core .net 库
13.1 时间抽象
新的 timeprovider 类和 itimer 接口添加了时间抽象功能,让你可以在测试方案中模拟时间。 此外,还可以使用时间抽象,通过 task.delay 和 task.waitasync 来模拟依赖于时间进度的 task 操作。 时间抽象支持以下基本时间操作:
检索本地和 utc 时间
获取用于测量性能的时间戳
创建计时器
以下代码片段演示了一些使用情况示例。


生益电子业绩大幅下降:三位核心技术“老将”离职 研发人员数量骤减
分享几个有趣的Linux命令
几个未来最具发展潜力的蓝牙技术应用市场
苹果13配置有什么与改变
驱动IC及Mini LED带动Q3营收或冲新高
.NET 8.0中有哪些新的变化?
从百度大脑看人脸识别最新技术进展
三星S10 Plus或许将支持5G网络
详解Google Dart 2.17版本的新语言特性
了解静态和流式IoT数据库架构
威兆MOS在光伏优化器中的应用
2022年有什么好的蓝牙耳机?新款好用的蓝牙耳机推荐
利用串行RapidIO实现FPGA协处理
以新模式赋能高速发展 共享经济传播第一人石宙灵提供新解法
智慧交通高速公路高清雷达测速仪的介绍
NVIDIA GPU助力复亚智能为无人机行业应用赋能
安达发|APS系统帮助家具行业建立精益生产计划
在NUCLEO_H743上玩MicroPython
厉害了我的华为p10能和小米5s飚性能,又能和iPhone7Plus比双摄像头
Note7噩梦空前:三星的表现反而逆天了?低价的note7是否能救三星?