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
}
O exposto acima parece funcionar bem, embora o ReSharper reclame que este é "acesso ao fechamento modificado". Alguém pode esclarecer isto?
(este tópico continua aqui )
Respostas:
Nesse caso, tudo bem, pois você está realmente executando o delegado dentro do loop.
Se você estivesse salvando o delegado e o usasse mais tarde, no entanto, descobriria que todos os delegados lançariam exceções ao tentar acessar os arquivos [i] - eles estão capturando a variável em
i
vez de seu valor no momento dos delegados criação.Em suma, é algo para estar ciente de uma armadilha em potencial , mas, neste caso, não a machuca.
Veja o final desta página para um exemplo mais complexo, onde os resultados são contra-intuitivos.
fonte
Sei que essa é uma pergunta antiga, mas recentemente estudei fechamentos e achei que um exemplo de código poderia ser útil. Nos bastidores, o compilador está gerando uma classe que representa um fechamento lexical para sua chamada de função. Provavelmente se parece com:
Como mencionado acima, sua função funciona porque os predicados são chamados imediatamente após a criação. O compilador irá gerar algo como:
Por outro lado, se você armazenasse e depois invocasse os predicados, veria que todas as chamadas para os predicados realmente chamariam o mesmo método na mesma instância da classe de fechamento e, portanto, usariam o mesmo valor para Eu.
fonte
"files" é uma variável externa capturada porque foi capturada pela função delegada anônima. Seu tempo de vida é estendido pela função de delegado anônimo.
Variáveis externas no MSDN
fonte