在回答 SO 问题时,我被告知我的解决方案将引入一个变量闭包,因此它的性能会稍差一些。所以我的问题是:
- 如何关闭?
- 它将如何影响性能?
这是 question
List.Where(s => s.ValidDate.Date == DateTime.Today.Year).ToList();
这是我的 solution .我引入了变量 yr
来存储年份。
int yr = DateTime.Now.Year;
List.Where(s => s.ValidDate.Year == yr).ToList();
它在答案的 comments 中
最佳答案
首先,这两种解决方案在功能上并不等同(如果您将日期与 int (.Date == .Today.Year
) 进行比较):
第一个代码片段为列表的每个值重新计算
DateTime.Today.Year
,当当前年份在迭代期间发生变化时,它可以给出不同的结果第二个片段存储当前年份并重复使用它,因此结果列表中的所有项目都将具有相同的年份。 (我个人会采用这种方法,因为我想确保结果正常)。
引入闭包是因为 lambda 从其外部范围访问变量,它关闭了 yr
的值。 C# 编译将生成一个新类,其中包含一个包含 yr
的字段。所有对 yr
的引用都将替换为新字段,原始 yr
甚至不会存在于编译后的代码中
我怀疑引入闭包会降低性能。如果有的话,使用闭包的代码会更快,因为它不必为每个列表项创建新的 DateTime
实例,然后取消引用两个属性。它只需要访问编译器生成的包含当前年份的 int 值的闭包类的字段。 (有人想比较生成的 IL 代码或分析这两个片段吗?:))
关于c# - "Closure over variable gives slightly worse performance"。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24711196/