gpt4 book ai didi

c# - 隐式捕获闭包,ReSharper 警告

转载 作者:IT王子 更新时间:2023-10-29 04:08:10 25 4
gpt4 key购买 nike

我通常知道“隐式捕获闭包”是什么意思,但是,今天我遇到了以下情况:

public static void Foo (Bar bar, Action<int> a, Action<int> b, int c)
{
bar.RegisterHandler(x => a(c)); // Implicitly captured closure: b
bar.RegisterHandler(x => b(c)); // Implicitly captured closure: a
}

为什么我还要隐含地捕获另一个 Action ?如果我评论这两行中的任何一行,另一行不会给我警告。有人知道 ReSharper 警告我的危险是什么吗?

编辑:ReSharper 8.0.1

最佳答案

这里的问题是,当您关闭一个变量时,幕后发生的事情是编译器创建一个新的未命名类型,为该类型提供一个实例字段,在该 block 中关闭的每个变量,为该代码块中的每个匿名方法提供一个方法,然后传递该对象的单个实例

这意味着第一个委托(delegate)的生命周期是保持那个闭包对象存活,并且它有一个对象b的引用,除了a,在内部,反之亦然。

现在在你的情况下,这不是问题,因为 Action 不是特别占用内存的东西,所以让它存活更长时间并不是真正的问题。

理论上,C# 团队可以确保在这种特殊情况下可以为同一 block 中的每个闭包创建一个新的未命名类型,但他们选择不这样做,因为这会使常见情况变得更糟。

关于c# - 隐式捕获闭包,ReSharper 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18859299/

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