2012-04-12 14 views
4

ReSharperのは、このローカル変数にするために私を提供し、「修正閉鎖へのアクセス」ローカル変数はなぜですか?

if (filter != null) 
{ 
    if (filter.CityId != 0) 
    { 
     ads = ads.Where(x => x.Ad.CityId == filter.CityId); 
    } 
    if (filter.BusinesCategoryId != 0) 
    { 
     ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId); 
    } 
} 

なぜローカル変数フィルタを行うことを書くでしょうか?

+2

どのローカル変数「ads」? – Tigran

答えて

6

クエリ(Where(...))が実行されていないためです。私はフィルタがループから得られると仮定しますか?

Linqクエリは、使用されるまで実行されません。フィルタの束が後で実行されてもループした場合、フィルタ値はクエリで間違っていました。

同様の質問:またAccess to Modified Closurehttp://devnet.jetbrains.net/thread/273042

は必ず100%に多くのコードを確認する必要があります。

+0

サイクルがあると危険ですか?私は繰り返さない。 – Mediator

+2

クローズはループなしで変更できます。ループは意図せずに変更されたクロージャ変数の最も一般的な原因ですが、それだけではありません。 – phoog

3

これを理解しているので、代理人(クロージャ)から変数にアクセスして代理人を実行する前に変数を変更すると、Resharperがエラーをスローします。これは主にデリゲート/ lambdaの中のforループ変数にアクセスし、それをループ外で実行する場合に発生します。あなたのコードが次のような場合:

foreach (filter in filters) 
{ 
     if (filter != null) { 
      if (filter.CityId != 0)  { 
       ads = ads.Where(x => x.Ad.CityId == filter.CityId); 
      } 
      if (filter.BusinesCategoryId != 0)  { 
       ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId); 
      } 
     } 
} 
return ads.ToList() 

それであなたはそれが期待されるように振る舞いません。しかし、ループスコープの中でラムダ式を実行すると問題はありません。

それがそのように動作し、なぜ多くの人がすでに非常によくそれを説明しているため、私は文句を言わない説明:

UPDATE: 「なぜローカル変数を使用するのですか?上記の問題の修正は、ローカル変数(つまり、ループ内)を使用し、ラムダでその変数を使用しているためです。そうすれば、ラムダの各インスタンスの変数の異なるインスタンスを閉じることになります。

関連する問題