2015-02-11 37 views
7

C#編譯器會優化空的void方法嗎? 喜歡的東西編譯器是否放棄了空方法?

private void DoNothing() 
{ 
} 

由於基本上,沒有代碼被添加,從以DoNothing調用堆棧,並再次刪除它,豈不是更好地優化這個叫走一邊跑?

回答

18

C#編譯器會優化空的void方法嗎?

不,他們仍然可以通過反射訪問,所以重要的是方法本身保持。

任何呼叫站點都可能包含呼叫 - 但JIT可能會優化它們。這樣做的狀況更好。它基本上是內聯的一個特例,內聯代碼是空的。

需要注意的是,如果你把它放到另一個對象:

foo.DoNothing(); 

無操作,因爲它會檢查foo是非空。

+0

啊,我沒有想到null調用方法,因此失敗 – 2015-02-11 09:53:03

3

從來沒有。編譯器不需要處理什麼是空的或沒有寫入。它就是你寫的,你在你的MSIL中。您可以點擊此處查看在ILDASM

enter image description here

3

如果你願意,你可以攔截針對每個項目後生成事件並運行IL檢查工具,將反映您生成的DLL,在你的類型檢查每一個MethodInfo並請求它的IL查找空IL模式,例如僅NoOp IL指令,並刪除不需要的方法。

例如: var ilBytes = SomeMethodInfo.GetMethodBody()。GetILAsByteArray();

一個好的混淆工具將以這種方式「修剪」方法。 preemptive.com/products/dotfuscator/features#pruning - 韋斯頓5分鐘前

你可以使用外部工具的Visual Studio中找到空的方法,並從他們的定義或使用的文件刪除它們

+1

一個好的混淆工具將以這種方式「修剪」方法。 http://www.preemptive.com/products/dotfuscator/features#pruning – weston 2015-02-11 08:58:15

+0

你說得很好,謝謝評論:) – 2015-02-11 09:08:26

相關問題