猿问

访问修改后的闭包

访问修改后的闭包

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抱怨说这是“访问修改后的闭包”,但上面的内容似乎很好。有人能说明这件事吗?


心有法竹
浏览 540回答 3
3回答

哈士奇WWW

在本例中,没关系,因为您实际上是在执行委托内循环。但是,如果您保存委托并稍后使用它,则会发现所有委托在尝试访问文件[i]时都会抛出异常-它们正在捕获变量&nbsp;i而不是在创建委托时它的价值。简而言之,作为一个电势陷阱,但在这种情况下它不会伤害你。见本页底部对于一个更复杂的例子,结果是违反直觉的。
随时随地看视频慕课网APP
我要回答