当前位置:首页 > 技术 > 正文内容

.NET 8 的主要新特性概览

访客 技术 2026年6月7日 1

性能增强

.NET 8 在性能方面取得了显著进步,引入了多项优化。动态配置文件引导优化 (PGO) 作为默认的代码生成器,能够根据实际应用场景动态调整代码,最高可提升 20% 的应用性能。新增的 AVX-512 指令集支持允许并行处理 512 位数据向量,大幅加快了数据处理速度。此外,基本数据类型(如数字)现在实现了新的可格式化和可解析接口,可以直接进行 UTF-8 格式化和解析,避免了不必要的转码开销。

.NET Aspire

.NET Aspire 是一个专为 .NET 构建云原生应用设计的技术栈,旨在简化弹性、可观察和可配置的云原生应用的开发。它集成了针对云原生优化的精选组件,并默认包含遥测、弹性、配置和健康检查等功能。Aspire 提供了便捷的本地开发体验,能够轻松发现、引入和配置云原生应用所需的依赖项。

容器镜像优化

.NET 8 进一步简化了容器化应用的打包过程,提高了安全性、减小了镜像体积并提升了效率。默认包含非 root 用户,增强了容器安全性。无需 Dockerfile,.NET SDK 即可发布容器镜像,并且镜像默认是非 root 的。更小的基础镜像和实验性的最小化镜像变体(针对 Native AOT)加速了容器的部署。新引入的 Chiseled Ubuntu 镜像变体提供了更强的安全加固。支持跨架构构建应用和容器镜像。

原生 AOT (Ahead-Of-Time) 编译

原生 AOT 编译消除了对运行时 JIT (Just-In-Time) 编译器的依赖,无需部署 JIT 编译器和 IL 代码,只包含应用程序必需的代码。这使得应用程序能在 JIT 编译受限的环境中运行,并朝着更高密度的可持续计算迈进。

人工智能集成

.NET 8 致力于将人工智能能力融入 .NET 应用。通过 .NET SDK 内置的 AI 功能和与其他工具的无缝集成,开发人员可以轻松利用生成式 AI 和大型语言模型。System.Numerics 库得到了增强,支持 Tensor Primitives 等,以更好地兼容生成式 AI 工作负载。与 Azure OpenAI、Azure Cognitive Search 等众多合作伙伴的协作,使 .NET 开发者能够方便地访问各类 AI 模型和服务。开源的 Semantic Kernel SDK 进一步简化了 AI 组件的集成。提供了包括聊天机器人、检索增强生成等在内的示例和模板。

Blazor 全栈 Web 应用

.NET 8 中的 Blazor 支持全栈 Web UI 开发,能够同时满足服务器端和客户端的需求。通过对加载时间、可扩展性和用户体验的优化,Blazor Server 和 Blazor WebAssembly 可以在同一应用中共存,并实现用户在运行时从服务器自动转移到客户端。基于"Jiterpreter"运行时和新组件,WebAssembly 上的 .NET 代码运行速度显著提升。Blazor 现在支持生成完整的 Blazor 身份 UI,增强了身份验证、授权和管理能力。

.NET MAUI 跨平台开发

.NET MAUI 提供单一项目和代码库来构建支持 WinUI、Mac Catalyst、iOS 和 Android 的应用。实验性的 Native AOT 现在支持 iOS 平台。新的 Visual Studio Code 扩展为跨平台移动和桌面应用开发提供了所需工具。支持 Xcode 15 和 Android API 34,可面向最新版本的 iOS 和 Android。在性能、控件、UI 元素以及平台特定行为(如桌面交互的点击处理、键盘监听)方面进行了大量改进。

C# 12 新特性

集合表达式

C# 12 引入了更简洁的集合初始化语法,统一了不同集合类型(数组、Span、List 等)的创建方式,减少了样板代码。


int[] array1 = [1, 2, 3, 4];
// Other collection initialization methods are now simplified or replaced by this syntax.
  

主构造函数

主构造函数扩展到所有类和结构,而不仅仅是记录类型,允许在类声明时直接定义构造函数参数,简化了字段和属性的初始化。


public class Account(string id, string owner)
{
    public string AccountID { get; } = id;
    public string Owner { get; } = owner;
}
  

别名任意类型

using 指令现在可以为任何类型(包括数组、元组、指针等)创建别名,提高了代码的可读性和简洁性。


using IntArrayAlias = int[];
using PointAlias = (int x, int y);
  

默认 Lambda 参数

Lambda 表达式现在支持默认参数,简化了处理可选参数的逻辑。


var multiply = (int x, int factor = 2) => x * factor;
// multiply(5) returns 10
// multiply(5, 3) returns 15
  

内联数组

内联数组是一种用于提高性能的特性,允许创建固定大小的结构体数组。虽然开发者通常不会直接声明,但在运行时 API 中使用 `Span` 或 `ReadOnlySpan` 时会透明地利用此特性。


[System.Runtime.CompilerServices.InlineArray(10)]
public struct FixedBuffer { private int _element; }

// Usage:
var buffer = new FixedBuffer();
// Access elements using buffer[index]
  

反射改进

.NET 8 增强了对函数指针的反射支持。现在,使用 `typeof` 或反射操作函数指针时,将返回 `System.Type` 对象,从而可以访问其元数据,如调用约定、返回类型和参数类型。新增了 `IsFunctionPointer`、`GetFunctionPointerReturnType` 等方法。


// Assuming 'fieldInfo' is FieldInfo for a function pointer
Type fpType = fieldInfo.FieldType;
Console.WriteLine($"IsFunctionPointer: {fpType.IsFunctionPointer}"); // True
Console.WriteLine($"Return type: {fpType.GetFunctionPointerReturnType()}"); // e.g., System.Void
  

配置绑定源生成器

.NET 8 引入了一个配置绑定源生成器,为 ASP.NET Core 提供 AOT 和可剪裁的配置支持,替代了基于反射的实现。该生成器在编译时收集类型信息,无需修改源代码。在 AOT Web 应用中默认启用,其他项目类型可通过设置 `EnableConfigurationBindingGenerator` 属性为 `true` 来启用。


// In .csproj
// <EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator>

// Code using configuration binding (e.g., IServiceCollection.Configure<TOptions>)
// will be optimized by the source generator.
  

Android 应用 AOT 编译优化

针对 Android 的 .NET 和 .NET MAUI 应用在发布模式下默认使用分析的 AOT (Profiled AOT) 编译。新引入的 `<AndroidStripILAfterAOT>` 属性允许进一步进行 IL 条带化,从而进一步减小应用体积。可结合使用分析的 AOT 和 IL 条带化以获得最佳效果。


<PropertyGroup>
  <AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
  <AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>
  

代码分析器

.NET 8 包含一系列新的代码分析器和修复程序,旨在帮助开发者正确高效地使用 .NET 库 API。这些分析器覆盖了性能(如 `String.StartsWith` 优于 `String.IndexOf`,使用具体类型,`Length`/`Count`/`IsEmpty` 优于 `Enumerable.Any`)、可靠性(类型兼容性检查)和可维护性(简化异常抛出)。

Core .NET 库增强

时间抽象

新增 `TimeProvider` 类和 `ITimer` 接口,提供了时间抽象能力,便于在测试中模拟时间,并支持 `Task.Delay` 和 `Task.WaitAsync` 的时间进度模拟。支持获取当前时间、时间戳以及创建计时器。


// Get UTC time
DateTimeOffset utcNow = TimeProvider.System.GetUtcNow();

// Create a timer
ITimer timer = timeProvider.CreateTimer(callback, state, TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan);
  

UTF8 改进

新实现的 `IUtf8SpanFormattable` 接口允许类型直接格式化为 UTF8 字节 Span,避免了 UTF16 转码。所有基本类型都已实现此接口。`Utf8.TryWrite` 方法提供了基于 UTF8 的格式化功能,支持所有标准格式符,包括新的"B"二进制说明符。


Span<byte> buffer = stackalloc byte[100];
int written;
Utf8.TryWrite(buffer, "Hello", out written); // Formats "Hello" as UTF8 bytes
  

加密支持

.NET 8 增加了对 SHA-3 哈希算法的支持(在 Linux 需 OpenSSL 1.1.1+,Windows 11 Build 25324+)。新增了 SHA3\_256、SHA3\_384、SHA3\_512 的哈希和 HMAC 功能,以及相应的 `HashAlgorithmName` 和 RSA OAEP 填充选项。


if (SHA3_256.IsSupported)
{
    byte[] hash = SHA3_256.HashData(inputBytes);
}
  

基于流的 ZipFile 方法

新增 `ZipFile.CreateFromDirectory` 和 `ZipFile.ExtractToDirectory` 的流重载,允许直接将目录内容压缩到流或从流中解压文件,增加了处理压缩文件的灵活性。


// Create zip to a stream
using Stream zipStream = File.OpenWrite("archive.zip");
ZipFile.CreateFromDirectory("sourceDir", zipStream);

// Extract from a stream
using Stream sourceStream = File.OpenRead("archive.zip");
ZipFile.ExtractToDirectory(sourceStream, "destinationDir");
  
标签: .NET 8性能

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。