正则表达式找到C#异步方法缺少" Async"后缀?

时间:2015-06-19 11:21:41

标签: 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

我最近一直在写很多异步代码,我担心我可能忘记了#34; Async&#34;某些方法的后缀。

我是否可以使用任何正则表达式来查找标有async的方法具有&#34; Async&#34;后缀?如果可能的话,可以反过来做(即找到的方法有&#34; Async&#34;后缀但标记的方法使用async关键字)?

我希望将正则表达式粘贴到&#34; Find In Files&#34; Visual Studio中的对话框,如果这对答案有任何影响。

我猜测像FxCop,CodeRush或ReSharper这样的工具可能已经警告过这样的事情,但是后两者在我的工作场所不是一个选择,而且我不需要安装&amp;如果我可以使用简单的正则表达式完成此操作,请配置前者。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

好孩子,干净的代码FTW。 :)除了任何其他答案,这里是我如何通过使用grep实用程序来实现的:

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

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

答案 2 :(得分:3)

这里有正则表达式:

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

它会查找关键字async,然后查找&#34;(&#34;没有(&#34;?&lt;!&#34;)async。

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

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

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