当前位置:首页 > 随笔 > 正文内容

.NET 10 类库新特性详解:核心功能增强与性能优化

访客 随笔 2026年5月26日 3

ISOWeek 对 DateOnly 的原生支持

在 .NET 早期版本中,ISOWeek 类主要围绕 DateTime 构建。随着 DateOnly 的引入,.NET 10 扩展了对这一轻量级日期类型的支持。新增以下方法:

  • GetWeekOfYear(DateOnly):获取指定 DateOnly 实例的 ISO 周数。
  • GetYear(DateOnly):返回对应年份。
  • ToDateTime(Int32, Int32, DayOfWeek):从年、周和星期构建 DateOnly 值。

此举提升了处理纯日期逻辑时的类型安全性和语义清晰度。

字符串的数字排序比较

为满足自然排序需求(如文件名或版本号排序),.NET 10 在 StringComparer 中引入了基于数值的比较模式。通过设置 CompareOptions.NumericOrdering,系统将识别并按数值大小而非字典序进行排序。

var comparer = StringComparer.Create(
    CultureInfo.CurrentCulture, 
    CompareOptions.NumericOrdering);

Console.WriteLine(comparer.Equals("7", "007")); // 输出: True

var sorted = new[] { "Item2", "Item10", "Item1" }
    .OrderBy(s => s, comparer)
    .ToArray();

// 结果顺序: Item1, Item2, Item10

注意:该选项不适用于 IndexOfStartsWith 等索引操作方法。

TimeSpan.FromMilliseconds 单参数重载完善

此前 TimeSpan.FromMilliseconds(long, long) 方法虽已存在,但缺少单参数形式,导致在表达式树等场景下无法编译。例如:

Expression<Action> expr = () => TimeSpan.FromMilliseconds(500); // 现在可正常编译

此补全使 API 更加一致,并解决了 LINQ 查询中的使用限制。

OrderedDictionary 新增带索引返回的 Try 操作

OrderedDictionary<TKey,TValue> 现提供增强版的 TryAddTryGetValue 方法,可同时返回条目在内部列表中的位置索引:

  • TryAdd(TKey key, TValue value, out int index)
  • TryGetValue(TKey key, out TValue value, out int index)

利用该索引,开发者可通过 GetAt(index)SetAt(index, newValue) 实现高效访问,避免二次查找。典型应用场景如下:

if (!dict.TryAdd("counter", 1, out var idx))
{
    var current = dict.GetAt(idx).Value;
    dict.SetAt(idx, current + 1);
}

此机制已在 JsonObject 内部实现中应用,带来 10%-20% 的属性更新性能提升。

JsonSerializer 支持保留引用配置生成

现在可在源生成器上下文中声明对象图循环引用处理策略。通过 JsonSourceGenerationOptions 特性指定 ReferenceHandler

[JsonSourceGenerationOptions(ReferenceHandler = JsonKnownReferenceHandler.Preserve)]
[JsonSerializable(typeof(SelfReferencingNode))]
internal partial class PreserveContext : JsonSerializerContext { }

internal class SelfReferencingNode
{
    public string Name { get; set; } = "Root";
    public SelfReferencingNode Parent { get; set; } = null!;
}

// 序列化结果包含 $id 与 $ref 标记
string json = JsonSerializer.Serialize(new SelfReferencingNode(), PreserveContext.Default.SelfReferencingNode);
// 示例输出: {"$id":"1","Name":"Root","Parent":{"$ref":"1"}}

此功能确保复杂对象图在序列化/反序列化过程中保持结构完整性。

禁止 JSON 重复属性反序列化

为增强安全性并符合严格解析要求,.NET 10 引入 JsonSerializerOptions.AllowDuplicateProperties 开关,默认启用,允许重复键覆盖;设为 false 则抛出异常:

string payload = """{"count":5,"count":10}""";

// 默认行为:后值覆盖前值
var result1 = JsonSerializer.Deserialize<Metrics>(payload);
Console.WriteLine(result1.Count); // 输出: 10

// 启用严格模式
var options = new JsonSerializerOptions { AllowDuplicateProperties = false };
JsonSerializer.Deserialize<Metrics>(payload, options); // 抛出 JsonException

// 此限制同样适用于 JsonDocument 和 Dictionary 反序列化
record Metrics(int Count);

检测机制兼容命名策略和大小写设置,确保一致性校验准确无误。

ZipArchive 性能与内存优化

.NET 10 对 ZIP 压缩库进行了深度重构:

  • 写入更新模式时不再强制加载所有条目至内存,显著降低峰值内存占用。
  • 提取操作实现多线程并行处理,充分利用现代 CPU 多核能力。
  • 内部缓存结构优化,减少分配开销。

这些改进使得大文件归档操作更快速、资源更友好,尤其适合服务器端批量处理场景。

全面异步 ZIP 操作 API

响应社区长期诉求,.NET 10 添加了一系列异步 ZIP 方法,支持非阻塞 I/O:

  • ZipArchive.CreateAsync(stream, mode, leaveOpen, encoding, token)
  • ZipArchiveEntry.OpenAsync(token)
  • ZipFile.CreateFromDirectoryAsync(...)
  • ZipFile.ExtractToDirectoryAsync(...)
  • ZipFile.OpenReadAsync(path, token)
  • ZipFileExtensions.CreateEntryFromFileAsync(...)

这些方法使应用程序在执行压缩任务时仍能保持高响应性,特别适用于 Web 服务或桌面 GUI 程序。

Windows 平台进程组独立启动

通过 ProcessStartInfo.CreateNewProcessGroup = true,可在独立进程组中启动子进程。这允许父进程向子进程发送控制信号(如 CTRL+C)而不影响自身运行状态。

var startInfo = new ProcessStartInfo
{
    FileName = "child.exe",
    CreateNewProcessGroup = true
};

using var child = Process.Start(startInfo)!;

// 向子进程组发送中断信号
GenerateConsoleCtrlEvent(CTRL_C_EVENT, child.Id);

child.WaitForExit(); // 等待优雅退出

结合 PosixSignalRegistration 或控制台事件处理器,可实现可靠的进程生命周期管理,避免强制终止带来的资源泄漏问题。

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

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