Я надеялся, что кто-нибудь сможет объяснить мне, что может случиться в этом коде с плохой вещью, в результате чего ReSharper выдает предупреждение «Доступ к измененному закрытию»:
bool result = true;
foreach (string key in keys.TakeWhile(key => result))
{
result = result && ContainsKey(key);
}
return result;
Даже если приведенный выше код кажется безопасным, что плохого может случиться в других случаях «модифицированного замыкания»? Я часто вижу это предупреждение в результате использования запросов LINQ, и я склонен игнорировать его, потому что я не знаю, что может пойти не так. ReSharper пытается решить проблему, создав вторую переменную, которая кажется мне бессмысленной, например, это меняет строку foreach
выше на:
bool result1 = result;
foreach (string key in keys.TakeWhile(key => result1))
Обновление: в примечании, очевидно, что весь кусок кода может быть преобразован в следующий оператор, который не вызывает предупреждений об изменении закрытия:
return keys.Aggregate(
true,
(current, key) => current && ContainsKey(key)
);