gpt4 book ai didi

c# - 为什么*不* ReSharper 告诉我 “implicitly captured closure” ?

转载 作者:太空狗 更新时间:2023-10-29 23:29:27 25 4
gpt4 key购买 nike

This question它的答案很好地解释了隐式捕获闭包的概念。但是,我偶尔会看到代码似乎应该生成有问题的警告,但实际上并没有。例如:

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)
{
}

我的期望是我会被警告 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 {

}

很明显,longlived delegate 捕获了 Expensive 变量,并且在它死亡之前不会被收集。但是(至少对我而言),Resharper 不会就此警告您。虽然不能将其命名为“错误”,但肯定有改进的地方。

关于c# - 为什么*不* ReSharper 告诉我 “implicitly captured closure” ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36608443/

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