gpt4 book ai didi

c# - C# 中的闭包分配

转载 作者:太空狗 更新时间:2023-10-29 17:43:05 24 4
gpt4 key购买 nike

我已经安装了 Clr 堆分配分析器扩展,在一个项目中我看到了一些我完全不理解的东西,我有一个带有签名的方法

public Task<int> ExecuteAsync(string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
{
param = SetModificationValuesForGlobalRing(param);
return _sqlPolicy.ExecuteAsync(async () =>
{
int result;
using (var connection = new SqlConnection(_connectionString))
{
await connection.OpenAsync();
result = await connection.ExecuteAsync(sql, param as object, transaction, commandTimeout, commandType);
}
return result;
});
}

这个工具给我一个关于方法和所有参数的警告

The compiler will emit a class that will hold this as a field to allow capturing of this closure.

我不知道为什么会出现这种行为,是因为可选参数吗?

最佳答案

你必须是:

  1. 从匿名函数(如 lambda)中调用此代码。

    • 或-
  2. 在某处使用 yield/await 关键字。

当您使用上述任何一种时,C# 必须创建一个闭包来捕获闭包中使用的任何变量,这些变量的原始作用域在您的 lambda 之外(在第一种情况下)或在 之前的用法在 yield/await 之后(在第二种情况下)。

C# 通过在内存中创建匿名类(在编译时定义)来捕获闭包。然后它为它需要保留的每条信息在该匿名类上创建一个字段。这可能会导致对象实例的生命周期延长到闭包的生命周期或具有 yield/await 的方法的生命周期。

有时生命周期比您不使用 yield/await 或 lambda 时更长。在这种情况下,您可能会注意到内存使用率高于您的预期(因为垃圾收集器不会收集对象实例,直到闭包完全超出范围或包含 yield/await 的方法已完成)。

您看到的警告只是您的工具试图向您解释上述内容,以便您知道预期此行为以及由此导致的内存使用量的潜在增加。

关于c# - C# 中的闭包分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271719/

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