假設我想創建一個匿名getter函數來返回成員變量foo的當前值。我可能會寫:什麼時候變量是閉包的一部分?
Func<int> myFunction = delegate() { return foo; };
但說我想要一個函數,foo的值,綁定該值將其關閉,然後返回每次被稱爲時間價值。我會寫同樣的東西:
Func<int> myFunction = delegate() { return foo; };
C#編譯器如何說明差異?有什麼方法可以更具體地詢問你想要什麼?
假設我想創建一個匿名getter函數來返回成員變量foo的當前值。我可能會寫:什麼時候變量是閉包的一部分?
Func<int> myFunction = delegate() { return foo; };
但說我想要一個函數,foo的值,綁定該值將其關閉,然後返回每次被稱爲時間價值。我會寫同樣的東西:
Func<int> myFunction = delegate() { return foo; };
C#編譯器如何說明差異?有什麼方法可以更具體地詢問你想要什麼?
匿名函數總是使用閉包。
沒有辦法只捕獲變量的值。
如果你不想要的功能,看變化的變量,你可以做一個單獨的臨時變量和使用,在功能,
看看Eric Lippert's two-part article過這個問題,特別修改封「錯誤」。他比我讀過的任何人都做得更好。
@SLaks是正確的,但無法捕獲變量的值。
「匿名函數總是使用閉包」或者它們關閉所有引用的變量。可以使用工廠方法正確地限定這些引用變量的範圍,以便Func<int>
在創建Func<int>
時返回foo
的值。採取以下措施。
private static Func<int> CreateFooFunc(int scopedFoo)
{
return() => scopedFoo;
//FYI, the line above is more concise version of line below
//return() => { return scopedFoo; };
//which is a more concise version of line below
//return delegate() { return scopedFoo; };
}
或非靜態的,取決於用例。
private Func<int> CreateFooFunc()
{
var scopedFoo = foo;
return() => scopedFoo;
}
或更好的非靜態版本恕我直言(其他人可能不同意)
private Func<int> CreateFooFunc()
{
return CreateFooFunc(foo)
}
現在,您可以執行下列操作和myFunction的將包含評估時,將在返回的foo
值的函數它創建的時間。
Func<int> myFunction = CreateFooFunc(foo);
請記住,如果foo
本身的價值是可變的(一個POCO爲例),那麼你就必須把它或CreateFooFunc
裏面的東西纔能有同樣的效果複製。