例如我有一個方法與內部FUNC:每次調用方法時Func都會編譯嗎?
private void Method()
{
Func<int, string> myFunc => (int) { return int.ToString();}
var res = myFunc(42);
}
函數功能將被編譯1時間或每當方法將被調用?
也請分享一下鏈接,如果你有這樣的,因爲這是一種辯
例如我有一個方法與內部FUNC:每次調用方法時Func都會編譯嗎?
private void Method()
{
Func<int, string> myFunc => (int) { return int.ToString();}
var res = myFunc(42);
}
函數功能將被編譯1時間或每當方法將被調用?
也請分享一下鏈接,如果你有這樣的,因爲這是一種辯
看起來,你是混亂的表達式:
Expression<Func<int, string>> myFuncExpr = someInt => someInt.ToString();
和代表:
Func<int, string> myFunc = someInt => someInt.ToString();
他們使用lambda表達式時有類似的聲明語法,但表達式樹不會編譯爲代表,直到你致電myFuncExpr.Compile()
。每次調用Compile
時,都會進行編譯,因爲表達式樹是代表代碼的一種方式(特別是C#代碼),而不是代碼本身。
另一方面,代理將被編譯一次,其餘源代碼從您的程序集中。從編譯器的角度來說,這裏的lambda只是另一種聲明方法體的方法,也就是代碼本身。所以,沒有任何理由以不同的方式編譯它。
這是它是如何編譯
[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的一生中。
它將被編譯一次,就像其他代碼一樣。 – decPL
你有鏈接,我可以閱讀更多關於它如何在內部工作嗎? –
@OlegKalyta我不認爲有任何關於「我們爲什麼只編譯一次」的問題。一個足夠愚蠢的編譯器*可能會在每次調用函數時重新編譯函數。或者它可以每100毫秒重新編譯它們,即使它們沒有被調用!或者它可以發送電子郵件給你的祖母或生成一個小房子的位圖圖像。但我們沒有理由相信它會做這些事情,因爲它會很愚蠢。 – jalf