string [] files = new string[2];
files[0] = "ThinkFarAhead.Example.Settings.Configuration_Local.xml";
files[1] = "ThinkFarAhead.Example.Settings.Configuration_Global.xml";
//Resharper complains this is an "access to modified closure"
for (int i = 0; i < files.Length; i++ )
{
// Resharper disable AccessToModifiedClosure
if(Array.Exists(Assembly.GetExecutingAssembly().GetManifestResourceNames(),
delegate(string name) { return name.Equals(files[i]); }))
return Assembly.GetExecutingAssembly().GetManifestResourceStream(files[i]);
// ReSharper restore AccessToModifiedClosure
}
Вышеуказанное работает нормально, хотя ReSharper жалуется, что это «доступ к измененному закрытию». Кто-нибудь может пролить свет на это?
(эта тема продолжена здесь )
Ответы:
В этом случае все в порядке, так как вы фактически выполняете делегат в цикле.
Если вы сохраните делегат и будете использовать его позже, вы обнаружите, что все делегаты выдают исключения при попытке доступа к файлам [i] - они захватывают переменную,
i
а не ее значение во время делегатов. создание.Короче говоря, это то, что нужно осознавать как потенциальную ловушку, но в этом случае это не повредит вам.
См. Нижнюю часть этой страницы для более сложного примера, где результаты противоречивы.
источник
Я знаю, что это старый вопрос, но недавно я изучал замыкания и подумал, что пример кода может быть полезен. За кулисами компилятор генерирует класс, который представляет лексическое замыкание для вашего вызова функции. Это выглядит примерно так:
Как упоминалось выше, ваша функция работает, потому что предикаты вызываются сразу после создания. Компилятор сгенерирует что-то вроде:
С другой стороны, если бы вы сохранили, а затем вызвали предикаты, вы бы увидели, что каждый отдельный вызов предикатов действительно будет вызывать один и тот же метод в одном и том же экземпляре класса замыкания и, следовательно, будет использовать то же значение для я.
источник
«files» - это захваченная внешняя переменная, потому что она была захвачена анонимной функцией делегата. Срок его службы продлевается функцией анонимного делегата.
Внешние переменные в MSDN
источник