2015-01-14 189 views
0

內架空委託定義的我很好奇,想知道發生了什麼幕後在這樣的情況:另一種方法

public static void OuterMethod() { 
    // some random code 
    var a = 42; 
    var b = "meaning of life";   

    Func<string, object> factory = (aString) { 
     // do something with a and b 
     return "Hello World"; 
    }; 

    // some more random code 
    factory("My string"); 
} 

我在OuterMethod被稱爲非常頻繁的情況下特別感興趣。在我的情況下,這是MVC請求管道,其中OuterMethod爲每個請求調用一次。

我每次調用該方法時都必須構建factory,從而導致大量開銷?我可以很容易地將OuterMethod以外的Func移動到它自己的靜態方法中,但是在我的實際場景中,因爲它是在裏面定義的,我可以訪問很多變量,我需要做我的計算,否則我需要在簽名中包含方法在外面定義。也許這只是一個微型優化,但我想更好地理解編譯器如何處理這些類型的語句。

+1

Servy的答案是正確的,您將在每次調用OuterMethod時創建一個委託的新參考。然而,從設計的角度來看,這可能會違反單一的責任原則。 OuterMethod負責構建對象(或者執行計算),並負責OuterMethod的真實工作。因此,以自己的方法進行工廠/計算會更可取。當然,如果您只是使用OuterMethod爲代理創建一個狀態環境,那就沒問題。 –

回答

2

實際的lambda會導致在編譯時創建一個新的命名方法(您只是不知道該名稱是什麼)(確切的語義會根據一些具體情況而有所不同)。

對每個方法調用所做的唯一工作是創建一個新的委託對象,該委託對象具有自己的指向同一個命名方法的指針。如果構建一個對象實例的確很難(提示:不是),那麼可以通過從方法中提取委託來保存該工作。

+0

謝謝!始終感謝您的洞察力。我有一種感覺,它會在編譯時以某種方式照顧我,但只是想確定:) –