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

本文关键字:后缀 异步方法 异步 用于 查找 正则表达式 | 更新日期: 2023-09-27 17:57:10

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

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

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

是否有任何正则表达式可用于查找标有async但没有"异步"后缀的方法?如果可能的话,是否可以进行相反的操作(即查找确实具有"Async"后缀但没有标有async关键字的方法)?

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

我猜像FxCop,CodeRush或ReSharper这样的工具可能已经警告过这样的事情,但是后两个不是我的工作场所的选择,如果我可以使用简单的正则表达式来完成这一点,我宁愿不必安装和配置前者。

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

这里有正则表达式:

(?i)async.*(?<!async)'(

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

编辑:更好的版本。谢谢@Andrew

Task's+('w+(?<!Async))'(

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

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

 async (void|Task(<.*>)?) [^<'(]*(?<!Async)(?:<.*?>)?'(

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

 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>()

好小伙子,干净的代码FTW。 :)除了任何其他答案外,以下是我通过使用grep实用程序的方法:

grep ''basync'b' file.cs | grep -v 'Async('

第一个grep查找所有包含async的行(作为一个单词),第二个grep将它们过滤为没有Async(的行。