未看过电影《分析这一点》,下面是简短的介绍:假设一个纽约家族的成员有可疑的习惯,他决定认真考虑接受治疗以改善他的精神状态。在比利·克里斯托和罗伯特·德尼罗的推动下,剧情一定会很有趣。虽然《分析这一点!》讽刺性地处理了被漫画化的 MOB 世界的问题,但使用正确的分析工具找到问题的根源在任何地方都至关重要。在任务关键型 LOB-App 世界中更是如此。
进入新的WinForms Roslyn Analyzers,这是 WinForms 应用程序的特定领域“顾问”。借助 .NET 9,我们推出了这些分析器,以帮助您的代码解决其潜在问题 — 无论是错误行为、可疑模式还是改进机会。
Roslyn 分析器到底是什么?
Roslyn 分析器是 Roslyn 编译器平台的核心部分,可在后台无缝工作,在您编写代码时对其进行分析。您可能已经使用它们多年却没有意识到这一点。Visual Studio 中的许多功能(如代码修复、重构建议和错误诊断)都依赖于分析器或代码修复,甚至只是分析器或代码修复来增强您的开发过程。它们已成为现代开发不可或缺的一部分,以至于我们常常将它们视为理所当然,只是“事物的工作原理”。
Visual Studio IDE 编辑器中选择分析器的屏幕截图
最酷的是:这个基于 Roslyn 的编译器平台不是黑盒子。它们提供了极其丰富的 API,不仅 Microsoft 的 Visual Studio IDE 或编译器团队可以创建分析器。每个人都可以。这就是 WinForms 采纳这项技术来改善 WinForms 编码体验的原因。
这只是开始 — 更多精彩即将到来
借助 .NET 9,我们为WinForms 专用分 总裁电子邮件列表 析器奠定了基础基础架构,并引入了第一组规则。这些分析器旨在解决安全性、稳定性和生产力等关键领域。虽然这只是一个开始,但我们致力于在未来版本中扩大其范围,并推出更多规则和功能。
那么,让我们真正地看一下我们为 .NET 9 引入的第一组分析器的功能:
选择正确的 InvokeAsync 重载的指南
在 .NET 9 中,我们为 WinForms 引入了一系列新的异步 API。这篇博文 详细介绍了新的 WinForms 异步功能。这是我们认为 WinForms Analyzers 可以在防止异步代码出现问题方面提供很大帮助的首批领域之一。
时的一个挑战是从以下选项中选择正确的重载:
每个重载都支持同步和异步方法的不同组合,有或没有返回值。链接的博客文章提供了有关这些 API 的全面背景信息。
然而,选择错误的重载可能会导致应用程序中的代码路径不稳定。为了缓解这种情况,我们实施了一个分析器,以帮助开发人员InvokeAsync根据其特定用例选择最合适的重载。
这是潜在的问题:InvokeAsync可以异步调用同步和异步方法。对于异步方法,您可能会传递一个 Func<Task>,并期望它被等待,但事实并非如此。Func<T>专门用于异步调用同步调用方法——这 Func<Task>只是一个不幸的特殊情况。
因此,换句话说,问题出现是因为InvokeAsync可以接受任何 Func<T>。但只有 才能Func<CancellationToken, ValueTask>被 API 正确等待。如果您传递一个Func<Task>没有正确签名的 —— 一个不接受CancellationToken并返回 的ValueTask—— 它将不会被等待。这会导致“发射后不管”的情况,其中函数内的异常无法正确处理。如果这样的函数随后抛出异常,它可能会损坏数据,甚至导致整个应用程序崩溃。
这是一个典型的场景,InvokeAsync 的重载被意外使用,而它本应返回任务以外的内容。但分析器指出:
异步分析器帮助找到 InvokeAsync 的正确过载
因此,通过此通知,我们也清楚地认识到我们实际上需要引入一个取消令牌,以便我们可以正常结束正在运行的任务,无论是当用户再次单击按钮时,还是当 Form 实际关闭时(这更重要)。否则,任务将继续运行,而 Form 将被处置。这将导致崩溃:
分析器通过检测不兼容的用法InvokeAsync并指导您选择正确的重载来解决此问题。这可确保异步代码中行为稳定、可预测,并正确处理异常。
防止设计时业务数据泄露
在开发自定义控件或从 派生的业务控制逻辑类时 UserControl,通常使用属性来管理其行为和外观。然而,如果在设计时无意中设置了这些属性,就会出现一个常见问题。这通常是因为在设计阶段没有适当的机制来防范此类情况。