栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

ReSharper警告-访问修改后的闭包

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ReSharper警告-访问修改后的闭包

警告的原因是,在循环内您可能正在访问一个正在更改的变量。但是,在这种非循环上下文中,“修复”并没有真正为您做任何事情。

假设您有一个FOR循环,而if循环位于其中,而字符串声明位于其外部。在那种情况下,错误将正确地识别出获取不稳定对象引用的问题。

您不想要的示例:

string acctStatusforeach(...){  acctStatus = account.AccountStatus[...].ToString();  if (!SettableStatuses().Any(status => status == acctStatus))      acctStatus = ACCOUNTSTATUS.Pending.ToString();}

问题在于闭包将获取对acctStatus的引用,但是每次循环迭代都会更改该值。在 这种 情况下,最好:

foreach(...){  string acctStatus = account.AccountStatus[...].ToString();  if (!SettableStatuses().Any(status => status == acctStatus))      acctStatus = ACCOUNTSTATUS.Pending.ToString();}

由于变量的上下文是循环,因此每次都会创建一个新实例,因为我们已经将变量移到了本地上下文中(for循环)。

该建议听起来像是Resharper解析该代码中的错误。但是,在许多情况下,这是一个值得关注的问题(例如第一个示例,尽管引用已在闭包中捕获,但引用仍在更改)。

我的经验法则是,如果有疑问,请在当地定居。

这是一个我被咬过的真实例子:

        menu.MenuItems.Clear();        HistoryItem[] crumbs = policyTree.Crumbs.GetCrumbs(nodeType);        for (int i = crumbs.Length - 1; i > -1; i--) //Run through items backwards.        { HistoryItem crumb = crumbs[i]; NodeType type = nodeType; //Local to capture type. MenuItem menuItem = new MenuItem(crumb.MenuText); menuItem.Click += (s, e) => NavigateToRecord(crumb.ItemGuid, type); menu.MenuItems.Add(menuItem);        }

请注意,我捕获的是本地的NodeType类型,请注意nodeType和HistoryItem crumb.ItemGuid,而不是crumbs [i]
.ItemGuid。这确保了我的关闭不会引用将要更改的项目。

在使用本地变量之前,事件将使用当前值而不是我期望的捕获值触发。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/416801.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号