正则表达式查找缺少“Async”后缀的 C# 异步方法?

Ste*_*nds 3 c# regex visual-studio

在 C# 中,异步方法(用async关键字标记的那些)的约定之一是它们的名称应以“Async”后缀结尾:

public async Task MyMethod(/* params */) ...         <-- Bad, missing "Async" suffix
public async Task MyMethodAsync(/* params */) ...    <-- Good, as per convention
Run Code Online (Sandbox Code Playgroud)

我最近写了很多异步代码,我担心我可能忘记在某些方法上加上“Async”后缀。

是否有任何正则表达式可以用来查找那些标有async没有“Async”后缀的方法?如果可能的话,可以反向进行(即找到方法有一个“异步”后缀,但那些没有标有async关键字)?

如果这对答案有任何影响,我希望将正则表达式粘贴到 Visual Studio 中的“在文件中查找”对话框中。

我猜像 FxCop、CodeRush 或 ReSharper 这样的工具可能已经就这样的事情发出警告,但是鉴于我的工作场所,后两者不是一个选项,如果我能做到这一点,我宁愿不必安装和配置前者使用简单的正则表达式。

Lzy*_*nda 6

在这里使用正则表达式:

(?i)async.*(?<!async)\(
Run Code Online (Sandbox Code Playgroud)

它查找关键字 async ,然后在它之前查找没有 ("?<!") async 的 "("。

编辑:更好的版本。谢谢@安德鲁

Task\s+(\w+(?<!Async))\(
Run Code Online (Sandbox Code Playgroud)

这将为您提供在 和 处具有小的书面异步的方法。此外,它还允许使用查找和替换。

  • @StevenRands 尝试 `Task(?:&lt;?\w*&gt;?)\s+(\w+(?&lt;!Async))\(` (2认同)

dni*_*ess 5

这是一个也适用于泛型方法和返回结果的方法(可能再次使用泛型)的方法。

 async (void|Task(<.*>)?) [^<\(]*(?<!Async)(?:<.*?>)?\(
Run Code Online (Sandbox Code Playgroud)

我已经根据以下模式对其进行了测试:

 async void Test()
 async void Test<T>()
 async void Test<T, U>()
 async Task Test()
 async Task Test<T>()
 async Task Test<T, U>()
 async Task<T> Test()
 async Task<T> Test<T>()
 async Task<T> Test<T, U>()
 async Task<T<U>> Test()
 async Task<T<U>> Test<U>()
 async Task<T<U>> Test<T, U>()
Run Code Online (Sandbox Code Playgroud)