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);
    }
}

なぜローカル変数フィルターを使用するのですか?

4

2 に答える 2

6

query(Where(...))が実行されていないためです。フィルタはループから取得されると思いますか?

Linqクエリは、使用されるまで実行されません。そのため、多数のフィルターをループして後で実行を開始した場合、クエリのフィルター値が正しくなくなります。

同様の質問:変更されたクロージャへのアクセス また:http ://devnet.jetbrains.net/thread/273042

100%確実にもっと多くのコードを見る必要があるでしょう。

于 2012-04-12T05:32:46.700 に答える
3

私がこれをどのように理解しているかから、デリゲート(クロージャ)から変数にアクセスし、デリゲートを実行する前に変数を変更すると、Resharperはエラーをスローします。これは主に、デリゲート/ラムダ内の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()

そうすると、期待どおりに動作しなくなります。ただし、ループスコープ内でラムダ式を実行する場合は問題ありません。

多くの人がすでにそれを非常によく説明しているので、なぜそれがそのように動作するのか説明しません:

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

于 2012-04-12T06:01:39.730 に答える