如何从 .editorconfig 命名规则中排除异步 void 事件处理程序?

How can async void event handlers be excluded from .editorconfig naming rules?

提问人:Julian 提问时间:11/7/2023 最后编辑:Julian 更新时间:11/9/2023 访问量:106

问:

我想实现以下目标:

IDE(例如 Visual Studio)应使用一组规则来确定方法名称是否遵循以下约定,并在发生冲突时发出警告:

  1. 具有 or 返回类型的 Awaitable、异步方法应接收后缀,例如TaskTask<T>Asyncpublic async Task<string> FetchMyStringAsync()
  2. 不可等待的异步方法以及任何其他同步方法都不应具有此后缀,例如 或private async void MyEventHandler(object sender, EventArgs args)public bool IsValid(string input)

通过阅读这篇文章,可以在 .editorconfig 文件中创建命名规则,以便在异步方法在 C# 中没有后缀时获取建议、警告或错误:Async

# Async methods should have "Async" suffix
dotnet_naming_rule.async_methods_end_in_async.symbols = any_async_methods
dotnet_naming_rule.async_methods_end_in_async.style = end_in_async
dotnet_naming_rule.async_methods_end_in_async.severity = suggestion

dotnet_naming_symbols.any_async_methods.applicable_kinds = method
dotnet_naming_symbols.any_async_methods.applicable_accessibilities = *
dotnet_naming_symbols.any_async_methods.required_modifiers = async

dotnet_naming_style.end_in_async.required_prefix = 
dotnet_naming_style.end_in_async.required_suffix = Async
dotnet_naming_style.end_in_async.capitalization = pascal_case
dotnet_naming_style.end_in_async.word_separator = 

但是,这些规则也适用于签名,例如事件处理程序:async void

private async void OnSomeEventOccured(object sender, EventArgs args)
{
    await SomeOperationAsync();
}

private async Task SomeOperationAsync()
{
    // do some other asynchronous stuff here...
}

然后编辑会建议更改为 ,这是我不想要的。async void OnSomeEventOccured()async void OnSomeEventOccuredAsync()

如何更改上述规则集以排除方法签名并仅将其应用于?如果这是不可能的,根据我自己的研究,有没有其他方法可以实现这一目标?async voidasync Task

C# .NET Visual-Studio 异步 编辑器配置

评论


答:

-1赞 wenbingeng-MSFT 11/9/2023 #1

根据代码样式的命名规则,如果我们想指定标准化 async Task 而不是 async void,那么应该指定 dotnet_naming_symbols.any_async_methods.required_modifiers = async Task

但在实际测试中,这样的规范并不真正起作用。它确实忽略了 async void,但异步任务上显示的约束是 CA1822: 将成员标记为静态

enter image description here

我仔细研究了代码样式的命名规则,它解释了原因:

enter image description here

是的,目前支持代码样式的命名规则。

因此,如果可以在 editorconfig 中定义异步方法的命名规则,但不能指定 async void 或 async Task 来执行此操作。

评论

0赞 Julian 11/16/2023
谢谢你的回答。我知道这不是一个修饰符,而是一种类型。虽然这解释了为什么我的配置是这样,但这并不能为我的问题提供解决方案。我很欣赏这种努力,我愿意以不同的方式解决这个问题。Task