2014-01-16 14 views
10

これは、後で廃棄されるオブジェクトがラムダで使用されている場合に通常表示されるReSharperの警告「廃棄閉鎖へのアクセス」です。 Access to disposed closure in C#?ではこれについて少し詳しく説明しています。廃棄閉鎖へのアクセス - 安全なマーク方法

私の質問です:そのようlamdbasを​​取ると(言ったオブジェクトが配置される前に、あなたは、彼らが常に実行されていることを確認することができますので)すぐにそれらを実行する方法を示します。

を彼らは同様に安全マークする方法はあります、そのメソッドを使用するコードは、もはやそれらの警告を生成しません。

例:

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

... 

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

DoThisTwiceはデリゲート(またはラムダ)を受け取り、同期的に実行します。メソッドが戻るときに、ラムダはもう実行されません。それだけがmyObjectが処分されているので、私たちは行かなくてはなりません。私たちは、DoThisTwiceという行にコメントを付けることができますが、これは、同様の方法でメソッドを使用するすべての場所で行わなければなりません。代わりにDoThisTwiceを安全とマークしたいので、Resharperはメソッドの呼び出し元に対して警告を表示しません。

答えて

18

ReSharperの注釈を使用してこれを修正することができます。 ReSharperは、クロージャがどのくらい長く続くかを知る方法がありません。フィールドに代入される可能性があるので、ラムダが呼び出されるまでに破棄されるものを使用している可能性があることを警告します。

あなたはこのようにそれを修正することができます:

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

InstantHandle属性はアクションがすぐにではなく法の範囲を超えて保存されたと呼ばれているReSharperのを伝えます。

+0

*完全に*私が探していたもの! – chiccodoro

+0

うわー、とても素敵:) –

関連する問題