作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
与带有自由变量的 lambda 表达式的工作方式类似,我想实现我自己的闭包类来捕获一些方法参数。
public class Closure<TObject, TVariable>
{
public TVariable Variable { get; set; }
public Func<TObject, bool> Predicate { get; set; }
}
然后我有一些与 DateTime
实例一起工作的类。应该使用这个闭包类的方法之一是:
// Original Version
public IEnumerable<Item> GetDayData(DateTime day)
{
this.items.Where(i => i.IsValidForDay(day));
}
我想将其转换为使用 Closure
类。问题是我想重用(性能原因)我的 Closure
类实例:
private Closure<Item, DateTime> closure = null;
public IEnumerable<Item> GetDayData(DateTime day)
{
if (closure == null)
{
this.closure = new Closure<Item, DateTime>() {
Variable = reference of "day" param, <=== HOW ????????
Predicate = i => i.IsValidForDay(this.closure.Variable)
}
}
this.items.Where(this.closure.Predicate);
}
为了让我重用相同的 Closure
实例,我不必存储参数的值(到闭包的 Variable
字段中)而是方法参数的引用指针.因此,下次调用此方法时,闭包的 Variable
实际上会指向要使用的正确值。
我应该怎么做?
当编译器生成捕获 lambda 表达式自由变量的类时,也会做类似的事情。我一直在查看反编译代码(使用 Reflector),但我似乎不明白这是如何完成的...
最佳答案
你的例子有点错误(这也可能行不通,但语义/意图是正确的):
private Closure<Item, DateTime> closure = null;
public IEnumerable<Item> GetDayData(DateTime day)
{
if (closure == null)
{
this.closure = new Closure<Item, DateTime>() {
Predicate = i => i.IsValidForDay(this.closure.Variable)
}
}
// assign here, else you only capture it the first time
closure.Variable = day;
this.items.Where(this.closure.Predicate);
}
关于c# - 存储指向方法参数的指针以供以后重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356250/
命令 svn status 返回如下内容: ? SomeClient\BUTCHERED.docx M SomeClient\Development notes.txt ?
我是一名优秀的程序员,十分优秀!