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 抱怨这是“访问修改后的闭包”,但上面的内容似乎工作得很好。任何人都可以阐明这一点吗?
(这个话题继续here https://stackoverflow.com/questions/304258)
在这种情况下,没关系,因为您实际上正在执行委托within循环。
但是,如果您保存委托并稍后使用它,您会发现所有委托在尝试访问 files[i] 时都会抛出异常 - 他们正在捕获variable i
而不是其在创建代表时的值。
简而言之,作为一个人,这是需要注意的事情潜在的陷阱,但在这种情况下它不会伤害你。
See the 本页底部 http://jonskeet.uk/csharp/csharp2/delegates.html#captured.variables对于一个更复杂的例子,其结果是违反直觉的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)