1 性能提升
.NET 8 在整个堆栈中带来了数千项性能改进 。默认情况下会启用一种名为动态配置文件引导优化 (PGO) 的新代码生成器,它可以根据实际使用情况优化代码,并且可以将应用程序的性能提高高达 20%。现在支持的 AVX-512 指令集能够对 512 位数据向量执行并行操作,这意味着可以在更短的时间内处理更多的数据。原始类型(数字及其他类型)现在实现了新的可格式化和可解析接口,这使它们能够直接格式化和解析为 UTF-8,而无需任何转码开销。 
2.NET Aspire
.NET Aspire 是一个用于使用 .NET 构建弹性、可观察和可配置的云原生应用程序的堆栈。它包括一组针对云原生而增强的精选组件,默认情况下包括遥测、弹性、配置和运行状况检查。结合复杂而简单的本地开发人员体验,.NET Aspire 可以在第 1 天和第 100 天轻松发现、获取和配置云原生应用程序的基本依赖项。
点击这里查看.NET Aspire 的预览版本。 
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
现在提供各种示例和参考模板,展示模式和实践,以便开发人员轻松入门:
6Blazor – 使用 .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 不同的语法。以下是创建集合的几种方法:List<int>int [] Span<int>
int[] x1 = new int[] { 1, 2, 3, 4 }; int[] x2 = Array.Empty<int>(); WriteByteArray(new[] { (byte)1, (byte)2, (byte)3 }); List<int> x4 = new() { 1, 2, 3, 4 }; Span<DateTime> 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 type
using 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)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7
8.5 内联数组
运行时团队和其他库作者使用内联数组来提高应用的性能。 内联数组使开发人员能够创建固定大小的 struct 类型数组。 具有内联缓冲区的结构应提供类似于不安全的固定大小缓冲区的性能特征。 你可能不会声明自己的内联数组,但当它们从运行时 API 作为 System.Span<T> 或 System.ReadOnlySpan<T> 对象公开时,你将透明地使用这些数组。
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
它们的用法与任何其他数组类似:
var buffer = new Buffer(); for (int i = 0; i < 10; i++) { buffer[i] = i; } foreach (var i in buffer) { Console.WriteLine(i); }
区别在于编译器可以利用有关内联数组的已知信息。 你可能会像使用任何其他数组一样使用内联数组。 有关如何声明内联数组的详细信息,请参阅有关 struct 类型的语言参考。