使用 lambda 语法创建一个闭包

有关闭包的讨论,请参阅备注。假设我们有一个接口:

public interface IMachine<TState, TInput>
{
    TState State { get; }
    public void Input(TInput input);
}

然后执行以下操作:

IMachine<int, int> machine = ...;
Func<int, int> machineClosure = i => {
    machine.Input(i);
    return machine.State;
};

现在 machineClosure 指的是从 intint 的一个函数,它在幕后使用 machine 引用的 IMachine 实例来执行计算。即使参考 machine 超出范围,只要维护 machineClosure 对象,原始的 IMachine 实例将保留为闭包的一部分,由编译器自动定义。

警告:这可能意味着相同的函数调用在不同的时间返回不同的值(例如,在此示例中,如果机器保持其输入的总和)。在很多情况下,这可能是意料之外的,并且要避免功能样式中的任何代码 - 意外和意外关闭可能是错误的来源。