c# - 存储指向方法参数的指针以供以后重用

标签 c# pointers lambda

与带有自由变量的 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/

相关文章:

c# - Web API 2 路由属性不起作用

c# - 对于某些版本的 Windows,Windows 服务无法在用户使用 WTSQueryUserToken 登录时启动交互过程

c - 为什么地址运算符 (&) 对于通过函数传递的数组很重要?

c++ - std::array 和 lambda

c# - 如果始终在本地评估 Skip 和 Take,我如何在 EF Core 中运行分页查询?

C 编程,关于指针的困惑

C 动态内存分配如何工作

c++ - 通过非自动非常量左值引用时,for_each、map 和 lambda 出错

java - Lambda 只能与功能接口(interface)一起使用吗?

c# - 如何阅读带逗号的文本,然后在不带逗号的情况下书写?