2011-06-16 65 views
2

假設我想創建一個匿名getter函數來返回成員變量foo的當前值。我可能會寫:什麼時候變量是閉包的一部分?

Func<int> myFunction = delegate() { return foo; }; 

但說我想要一個函數,foo的值,綁定該值將其關閉,然後返回每次被稱爲時間價值。我會寫同樣的東西:

Func<int> myFunction = delegate() { return foo; }; 

C#編譯器如何說明差異?有什麼方法可以更具體地詢問你想要什麼?

回答

4

匿名函數總是使用閉包。

沒有辦法只捕獲變量的值。

如果你不想要的功能,看變化的變量,你可以做一個單獨的臨時變量和使用,在功能,

2

看看Eric Lippert's two-part article過這個問題,特別修改封「錯誤」。他比我讀過的任何人都做得更好。

@SLaks是正確的,但無法捕獲變量的

0

「匿名函數總是使用閉包」或者它們關閉所有引用的變量。可以使用工廠方法正確地限定這些引用變量的範圍,以便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裏面的東西纔能有同樣的效果複製。

相關問題