2011-11-17 34 views
2

我可以使ReSharper的发现下面的问题我的解决方案ReSharper的自动搜索和事件使用

if (this.SomeEvent != null) 
{ 
    this.SomeEvent (this, EventArgs.Empty); 
} 

EventHandler handler = this.SomeEvent; 
if (handler != null) 
{ 
    handler(this, EventArgs.Empty); 
} 

最好的自动化尽可能更换替代模式?

+0

我不记得检查的原因(即将事件分配给临时变量) - 为什么? – wal

回答

2

如果您有R#5或更高版本,可以使用结构搜索和替换,可在ReSharper | Find | Search with Pattern...找到。

在搜索模式,进入

if ($ev$ != null) 
{ 
    $ev$(this, EventArgs.Empty); 
} 

在替换模式,进入

EventHandler handler = $ev$; 
if (handler != null) 
{ 
    handler(this, EventArgs.Empty); 
} 

选择Add Placeholder | Expression,并创建一个名为System.EventHandlerev表达式占位符,确保Or derived type检查

点击Replace,你应该显示搜索模式的所有实例。单击树根上的复选框,然后单击替换将其全部替换。

+0

此搜索模式还会查找已正确的项目。我需要有一个条件'如果$ ev $不是局部变量'。 – bitbonk

+0

呃,哦,是/尴尬 – AakashM

+0

它可能还是一样好。我必须手动完成每个查找。 – bitbonk

0

您可以使用custom paterns进行代码检查。在Visual Studio中,转到选项,Resharper。在“代码检查”类别下找到“自定义模式”。您可以在许多内置检查之上添加自己的代码片段。

得到你想要的最简单方法是下一段文字保存到一个XML文件:

<CustomPatterns> 
    <Pattern Severity="SUGGESTION" FormatAfterReplace="True" ShortenReferences="True" Language="CSHARP"> 
    <Comment>Event call is not thread-safe</Comment> 
    <ReplaceComment>Convert to thread-safe event call</ReplaceComment> 
    <ReplacePattern><![CDATA[var eventHandler = $SomeEvent$; 
if (null != eventHandler) 
{ 
    eventHandler($args$); 
} 
]]></ReplacePattern> 
    <SearchPattern><![CDATA[if ($SomeEvent$ != null) 
{ 
    $SomeEvent$ ($args$); 
} 
]]></SearchPattern> 
    <Params> 
     <IgnoreBracesInSingleStatementBlocks>False</IgnoreBracesInSingleStatementBlocks> 
     <IgnoreParanthesisInExpressions>False</IgnoreParanthesisInExpressions> 
     <SmartMatchAssociativeExpressions>False</SmartMatchAssociativeExpressions> 
     <TreatReversedBinaryExpressionsEquivalent>Never</TreatReversedBinaryExpressionsEquivalent> 
    </Params> 
    <Placeholders> 
     <ArgumentPlaceholder Name="args" Minimal="-1" Maximal="-1" /> 
     <ExpressionPlaceholder Name="SomeEvent" ExpressionType="System.EventHandler" ExactType="False" /> 
    </Placeholders> 
    </Pattern> 
</CustomPatterns> 

,并使用导入功能的代码检查。你可以看到我做了什么,并通过实例学习。

这会给你一个VS中的resharper提示和一个无论发生哪种模式的修复建议。您可以使用“立即查找”查找所有搜索模式的出现。

一个大但(可悲)。固定模式也被认为是一个嫌疑犯。解决这个问题的唯一方法就像我现在看到的那样,是让搜索模式变得不那么通用。


编辑:

我不喜欢我的最后的评论,所以我试图做一些事情毕竟。我改变了XML,现在它工作。诀窍是在替换代码(if (null != eventHandler))中反转比较并关闭“匹配类似结构”。我已经开始自己使用这个代码检查,它实际上是一个好主意!

+0

@bitbonk:查看我的编辑 –