使用 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
指的是从 int
到 int
的一个函数,它在幕后使用 machine
引用的 IMachine
实例来执行计算。即使参考 machine
超出范围,只要维护 machineClosure
对象,原始的 IMachine
实例将保留为闭包的一部分,由编译器自动定义。
警告:这可能意味着相同的函数调用在不同的时间返回不同的值(例如,在此示例中,如果机器保持其输入的总和)。在很多情况下,这可能是意料之外的,并且要避免功能样式中的任何代码 - 意外和意外关闭可能是错误的来源。