gpt4 book ai didi

c# - 为什么 ReSharper 告诉我 "implicitly captured closure"?

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

我有以下代码:

public double CalculateDailyProjectPullForceMax(DateTime date, string start = null, string end = null)
{
Log("Calculating Daily Pull Force Max...");

var pullForceList = start == null
? _pullForce.Where((t, i) => _date[i] == date).ToList() // implicitly captured closure: end, start
: _pullForce.Where(
(t, i) => _date[i] == date && DateTime.Compare(_time[i], DateTime.Parse(start)) > 0 &&
DateTime.Compare(_time[i], DateTime.Parse(end)) < 0).ToList();

_pullForceDailyMax = Math.Round(pullForceList.Max(), 2, MidpointRounding.AwayFromZero);

return _pullForceDailyMax;
}

现在,我在 ReSharper 行添加了注释建议改变。这是什么意思,或者为什么需要更改? 隐式捕获闭包:结束,开始

最佳答案

警告告诉您变量 endstart 保持事件状态,因为此方法中的任何 lambda 都保持事件状态。

看看这个简短的例子

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);

int i = 0;
Random g = new Random();
this.button1.Click += (sender, args) => this.label1.Text = i++.ToString();
this.button2.Click += (sender, args) => this.label1.Text = (g.Next() + i).ToString();
}

我在第一个 lambda 处收到“隐式捕获的闭包:g”警告。它告诉我 g 不能是 garbage collected只要第一个 lambda 在使用中。

编译器为两个 lambda 表达式生成一个类,并将在 lambda 表达式中使用的所有变量放入该类中。

所以在我的示例中,gi 被保存在同一个类中以执行我的委托(delegate)。如果 g 是一个有大量资源遗留的重对象,垃圾收集器将无法回收它,因为只要任何 lambda 表达式在使用中,此类中的引用仍然存在.所以这是一个潜在的内存泄漏,这就是 R# 警告的原因。

@ split 者与在 C# 中一样,匿名方法总是将每个方法存储在一个类中,有两种方法可以避免这种情况:

  1. 使用实例方法而不是匿名方法。

  2. 将 lambda 表达式的创建分为两种方法。

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

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