2011-11-17 85 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:查看我的編輯 –