2014-01-16 19 views
10

這是關於ReSharper的警告,「訪問到設置關閉」當一個lambda使用稍後配置對象,其通常出現。 Access to disposed closure in C#?對此進行了更詳細的討論。進入到設置關閉 - 方法標記爲安全

我的問題是:對於採取這種lamdbas並立即執行它們(這樣你就可以確保他們始終執行上述對象佈置之前)方法:

有沒有辦法將它們標記爲安全,這樣任何使用該方法的代碼都不會產生這些警告?

實施例:

using (var myObject = new MyDisposableObject()) 
{ 
    DoThisTwice(() => myObject.DoSomething()); 
} 

... 

void DoThisTwice(Action do) 
{ 
    do(); 
    do(); 
} 

DoThisTwice需要委託(或λ)和同步執行它。當方法返回時,lambda將不再執行。只有myObject被處置,所以我們很好走。我們可以用註釋標記這條線,調用DoThisTwice,但必須在所有使用該方法的地方以類似的方式完成。相反,我想將DoThisTwice標記爲安全的,因此Resharper不會爲該方法的任何呼叫者顯示任何警告。

回答

18

您可以使用ReSharper的註釋來解決這個問題。 ReSharper無法知道封閉持續多久,例如它可能被分配給一個字段,所以它會警告你,你可能會使用一些在lambda被調用時會被丟棄的東西。

你能解決這個問題是這樣的:

void DoThisTwice([InstantHandle] Action action) 
{ 
    action(); 
    action(); 
} 

InstantHandle屬性告訴ReSharper的這一行動被稱爲立即,而不是存儲超出方法的範圍。

+0

*確切*我在找什麼! – chiccodoro

+0

哇,非常好:) –