2013-10-28 86 views
1

例如我有一個方法與內部FUNC:每次調用方法時Func都會編譯嗎?

private void Method() 
{ 
    Func<int, string> myFunc => (int) { return int.ToString();} 
    var res = myFunc(42); 
} 

函數功能將被編譯1時間或每當方法將被調用?

也請分享一下鏈接,如果你有這樣的,因爲這是一種辯

+1

它將被編譯一次,就像其他代碼一樣。 – decPL

+0

你有鏈接,我可以閱讀更多關於它如何在內部工作嗎? –

+2

@OlegKalyta我不認爲有任何關於「我們爲什麼只編譯一次」的問題。一個足夠愚蠢的編譯器*可能會在每次調用函數時重新編譯函數。或者它可以每100毫秒重新編譯它們,即使它們沒有被調用!或者它可以發送電子郵件給你的祖母或生成一個小房子的位圖圖像。但我們沒有理由相信它會做這些事情,因爲它會很愚蠢。 – jalf

回答

5

看起來,你是混亂的表達式:

Expression<Func<int, string>> myFuncExpr = someInt => someInt.ToString(); 

和代表:

Func<int, string> myFunc = someInt => someInt.ToString(); 

他們使用lambda表達式時有類似的聲明語法,但表達式樹不會編譯爲代表,直到你致電myFuncExpr.Compile()。每次調用Compile時,都會進行編譯,因爲表達式樹是代表代碼的一種方式(特別是C#代碼),而不是代碼本身。

另一方面,代理將被編譯一次,其餘源代碼從您的程序集中。從編譯器的角度來說,這裏的lambda只是另一種聲明方法體的方法,也就是代碼本身。所以,沒有任何理由以不同的方式編譯它。

4

這是它是如何編譯

[CompilerGenerated] 
private static Func<int, string> CS$<>9__CachedAnonymousMethodDelegate1; 

private void Method() 
{ 
    Func<int, string> myFunc = (CS$<>9__CachedAnonymousMethodDelegate1 != null) ? CS$<>9__CachedAnonymousMethodDelegate1 : (CS$<>9__CachedAnonymousMethodDelegate1 = new Func<int, string>(Program.<Method>b__0)); 
    string res = myFunc(0x2a); 
} 

因此明確表示,它就會創建一次,並存儲在一個靜態字段。

還要注意,即使這是實例方法,委託也是靜態的。所以它恰好發生在AppDomain的一生中。

相關問題