gpt4 book ai didi

resharper - 为什么resharper建议 “wrap variable in array”访问修改后的关闭警告?

转载 作者:行者123 更新时间:2023-12-03 11:58:23 25 4
gpt4 key购买 nike

给出以下(经过大量编辑的伪)代码:

int count = 0;
thing.Stub(m => m.AddBlah()).WhenCalled(o => count++);
thing.Stub(m => m.RemoveBlah()).WhenCalled(o => count--);

DoStuff(thing);

Assert.AreEqual(1, count);

ReSharper提供了有关计数的警告-“访问已修改的闭包”。我理解为什么收到此警告(在两个不同的lambda中修改了count变量,并且可能具有不期望的语义),但是我不理解ReSharper的建议:“将局部变量包装在数组中”。如果我让ReSharper这样做,我将得到:
int count[] = { 0 };
thing.Stub(m => m.AddBlah()).WhenCalled(o => count[0]++);
thing.Stub(m => m.RemoveBlah()).WhenCalled(o => count[0]--);

DoStuff(thing);

Assert.AreEqual(1, count[0]);

而且没有警告。

为什么使用数组安全?

最佳答案

我本人在ReSharper中注意到了同样的事情,并且还想知道为什么将值包装在数组中时它不会发出警告。不幸的是,这里的另一个答案是错误的,并且似乎误解了闭包是如何实现的,所以我想尝试解释一下(我认为是)重构背后的原理。

如您所见,无论是否用数组包装,结果都是相同的,因此重构并没有真正“解决”任何问题,并且在应用更改后,访问普通的已修改闭包时可能遇到的相同问题。但是,在更改之后,由于count数组本身(仅是其内容)没有被修改,因此“访问修改后的闭包”警告不再相关。

所做的更改实际上并没有使问题变得更加明显(至少在我看来),因此,似乎该建议实际上是在告诉ReSharper忽略该问题,而不必借助相当困惑的// ReSharper disable AccessToModifiedClosure机制来抑制该问题。错误。

关于resharper - 为什么resharper建议 “wrap variable in array”访问修改后的关闭警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6467129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com