使用 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
例項將保留為閉包的一部分,由編譯器自動定義。
警告:這可能意味著相同的函式呼叫在不同的時間返回不同的值(例如,在此示例中,如果機器保持其輸入的總和)。在很多情況下,這可能是意料之外的,並且要避免功能樣式中的任何程式碼 - 意外和意外關閉可能是錯誤的來源。