使用 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 例項將保留為閉包的一部分,由編譯器自動定義。

警告:這可能意味著相同的函式呼叫在不同的時間返回不同的值(例如,在此示例中,如果機器保持其輸入的總和)。在很多情況下,這可能是意料之外的,並且要避免功能樣式中的任何程式碼 - 意外和意外關閉可能是錯誤的來源。