2012-04-17 233 views
34

我有一個類庫,只使用它的一部分。是否需要刪除未使用的內容以縮小創建的代碼的大小(在發佈配置中)?編譯器是否只編譯可以執行的代碼?

據我所見,編譯器負責這一點,刪除代碼不會改變EXE文件的大小。這將永遠是真的嗎?刪除所有不需要的代碼將花費很長時間,所以我想知道是否需要這樣做。

更多信息:類庫中有方法和類不從執行代碼中調用,而是由類庫中的其他代碼部分引用(本身不會調用它們)。

+3

您總是可以獲取.NET反射器並查看「發佈」DLL中包含的內容。最好的學習方法是試驗(或者我的經驗如此) – 2012-04-17 13:22:37

+3

編譯器是否能夠告訴你永遠不會將該DLL分發給可能試圖使用該代碼的人? – 2012-04-17 13:22:47

+1

@AnonyPegram庫不是單獨編譯的。我的項目中有源代碼。 – ispiro 2012-04-17 13:24:47

回答

34

不,編譯器也包含「死」代碼。一個簡單的原因是,並不總是可以確切地知道哪些代碼將會被執行。例如,即使是從未引用的私有方法也可以通過反射來調用,而公共方法可以被外部程序集引用。

您可以使用工具來幫助您查找和刪除未使用的方法(包括僅由其他未使用的方法調用的方法)。試試What tools and techniques do you use to find dead code?Find unused code讓你開始。

0

我懷疑編譯器會刪除任何東西。事實是,編譯器無法分辨使用什麼和不使用什麼,因爲類型可以通過反射實例化和名稱調用。

6

這一切都被編譯。不管它是否被調用。代碼可能由外部庫調用。

使編譯器忽略代碼的唯一方法是使用Compiler Preprocessor指令。更多關於那些here

+0

如果它是公共類或公共類的受保護成員,它只能由外部庫調用。 – 2018-02-13 16:09:46

0

讓我們假設有一個類庫叫Utility。您創建了一個新項目並將該類庫添加到該項目中。即使您的EXE只從類庫中調用了1-2個方法,刪除未引用的代碼也不是一個好主意。

這將違背可重複性原則。儘管從EXE中未提及的庫中會出現一些類,但它不會對程序的性能或大小產生任何不利影響。

0

確定所有和唯一的死代碼是(如果理想化的人有像語言一樣的「數學世界」)在大多數語言中遞歸地不可判定。 (像Blaise語言這樣的一些罕見程序是可以確定的。)

相關問題