36

I have a class library and am using only part of it. Is there a need to delete what isn't being used in order to shrink the size of the created code (in release configuration)?

As far as I've seen, the compiler takes care of that, and removing the code doesn't change the EXE file size. Will this always be true? Removing all unneeded code would take very long, so I want to know if there's need for that.

More information: there are methods and classes in the class library that aren't called from the executing code, but are referenced by other parts of code in the class library (which themselves are never called).

4

6 回答 6

41

不,编译器也包含“死”代码。一个简单的原因是,并不总是能够准确地知道哪些代码将被执行,哪些代码不会被执行。例如,即使是从不引用的私有方法也可以通过反射调用,而公共方法可以被外部程序集引用。

您可以使用工具来帮助您查找和删除未使用的方法(包括仅由其他未使用的方法调用的方法)。尝试您使用哪些工具和技术来查找死代码?查找未使用的代码以帮助您入门。

于 2012-04-17T13:24:52.767 回答
6

这一切都被编译了。不管它是否被调用。代码可以被外部库调用。

使编译器忽略代码的唯一方法是使用编译器预处理器指令。更多关于这里的内容。

于 2012-04-17T13:25:29.917 回答
0

我怀疑编译器会删除任何东西。事实是,由于反射,编译器无法分辨出什么被使用,什么未被使用,因为类型可以被实例化,方法可以通过名称调用,这要归功于反射。

于 2012-04-17T13:25:02.673 回答
0

假设有一个名为Utility. 您创建了一个新项目并将这个类库添加到该项目中。即使您的 EXE 只调用了类库中的 1-2 个方法,删除未引用的代码也不是一个好主意。

这将违反可重用性原则。尽管库中存在一些未从 EXE 引用的类,但它不会对程序的性能或大小产生任何不良影响。

于 2012-04-17T13:26:26.433 回答
0

在大多数语言中,确定所有且唯一的死代码(如果人们理想化一个人有一个像语言一样的“数学世界”)递归地无法确定。(一些罕见的语言,如 Blaise 语言是可判定的。)

于 2015-06-24T15:42:38.917 回答
0

关于是否“需要删除未使用的内容以缩小创建代码的大小”的问题:我认为这只会对节省网络带宽有用。删除未使用的代码在 Web 应用程序中对于提高加载速度等至关重要。

如果您的代码是 exe 或库,我看到删除死代码的唯一原因是提高您的代码质量。这样在 2 年后查看您的代码的人就不会摸不着头脑想知道它的作用。

于 2018-12-03T23:12:43.477 回答