提问人:Raptor 提问时间:6/24/2022 最后编辑:Raptor 更新时间:6/24/2022 访问量:307
修复 c 中可枚举 lambda 中的闭包分配#
Fix closure allocations in enumerable lambdas in c#
问:
我在 Rider 中有 DPA 插件,它向我展示了 lambda 中的一些闭包分配。
我知道什么是封闭以及为什么会有封闭。我知道为什么被创造。c_DisplayClassxx
但我的问题是 - 如何更改代码来修复它?
大多数情况下,我的问题出在可枚举中,,...我不知道如何编写谓词来避免闭包分配。Where
FirstOrDefault
下面是一个示例 - 闭包获取所有 5 个参数,它消耗大量内存。
public IList<RequirementMappingRule> FindItems(ProductFilterMap productMapItem,
RuleProviderContext context)
{
var financialCompanyCode = productMapItem.Product.Product.FinancialCompanyCode;
var parentRiskCode = productMapItem.ParentRiskCode;
var riskCode = productMapItem.Risk.Risk.Code;
var ruleCandidates = Items.Where(r =>
(r.CompanyCode == financialCompanyCode || r.CompanyCode == "*")
&& r.ParentRiskCode == parentRiskCode
&& (string.IsNullOrWhiteSpace(r.RiskCode) || r.RiskCode == riskCode)
&& r.IsValidByRiskValue(productMapItem, context))
.ToList();
// etc. ...
}
更新:只是为了澄清我的问题 - 闭包捕获 financialCompanyCode、parentRiskCode 等。我想知道是否有任何模式可以避免完全闭合。我认为使用和参数总是以闭包和生成结束,所以修复它的唯一方法是不使用和使用或获取项目。Where
DisplayClass
Where
foreach
for
我说得对吗?
答: 暂无答案
下一个:Blazor 循环、闭包和绑定
评论
r.IsValidByRiskValue(productMapItem, context)
看看这个函数,也许可以改变它,这样你就不需要传递整个上下文了Where
foreach
hot path
Where