dlf*_*dlf 5 c# resharper lambda closures resharper-9.2
这个问题及其答案很好地解释了隐式捕获闭包的概念.但是,我偶尔会看到代码似乎应该生成有问题的警告,实际上并没有.例如:
public static void F()
{
var rnd1 = new Random();
var rnd2 = new Random();
Action a1 = () => G(rnd1);
Action a2 = () => G(rnd2);
}
private static void G(Random r)
{
}
Run Code Online (Sandbox Code Playgroud)
我的期望是,我会被警告,a1隐含地捕获rnd2,并a2隐含地捕获rnd1.但是,我根本没有得到任何警告(链接问题中的代码确实为我生成了它).这是ReSharper的一个错误(v9.2),还是由于某种原因不会在这里发生隐式捕获?
我认为 Resharper 由于某种原因无法发现这种情况下隐式捕获的变量。您可以使用一些反汇编程序来验证编译器是否生成带有 rnd1 和 rnd2 的单个类。您的示例还不清楚,但让我们以 Eric Lippert 博客文章中的示例为例(https://blogs.msdn.microsoft.com/ericlippert/2007/06/06/fyi-c-and-vb-closures-are -per-scope/),他描述了一个危险的隐式捕获的示例:
Func<Cheap> M() {
var c = new Cheap();
var e = new Expensive();
Func<Expensive> shortlived = () => e;
Func<Cheap> longlived = () => c;
shortlived();
// use shortlived
// use longlived
return longlived;
}
class Cheap {
}
class Expensive {
}
Run Code Online (Sandbox Code Playgroud)
在这里很明显,长寿的委托捕获了昂贵的变量,并且在它死亡之前不会被收集。但是(至少对我来说),Resharper 不会警告你这一点。虽然不能将其命名为“bug”,但肯定有改进的地方。
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |