【问题标题】:C# Compiler Smart CompilationC#编译器智能编译
【发布时间】:2012-03-22 11:45:51
【问题描述】:

如果之前有人问过这个问题,或者现在可以回答,我深表歉意。

我正在处理一个大型代码库(其中大部分是在我开始工作之前由另一位软件工程师编写的,标准事务)。我在这个项目中添加了相当多的代码,其中大部分都将现有方法包装到对象/库中以便于重用。通过包装,我的意思是我已将它们复制到一个新的对象/库中,对它们进行编辑以使它们作为独立对象或库(如果适用)工作,并在原始代码库中的适当位置调用/实例化它们。

例如,我没有将提供某个一次性函数的大型方法 (foo) 包含在主 exe 的一个 .cs 文件中,而是将其包装在它自己的类中并将其分开,以便它可以(理论上)用于其他项目或解决方案的不同部分。

IE 从这里开始:

/* somewhere in Main */
void Main ()
{
...
foo (arg1, arg2, arg3)
...
}

foo (arg1, arg2, arg3)
{
//some massive functionality
}

到这里:

/* somewhere in Main or any other part of the code base */
Foo myFoo = new Foo (arg1, arg2, arg3);
myFoo.DoSomething();

今天,我开始查看代码库并注释掉所有旧方法(我已经包装到对象/库中的方法),以找出我可以从原始代码中删除哪些方法根据。我正在使用版本控制软件,我一次做几个,然后重新编译并执行一些测试以检查我没有破坏任何东西。

我的问题是: 当我编译时,C# 编译器(使用 3.5 版)是否足够智能,不会包含永远不会被调用、实例化或使用的方法/函数/对象/库?

我仍将整理/清理现已弃用的方法/函数,但我只是想知道编译器是否可以生成不包含这些方法/函数的输出。

TL;DR:如果我有以下 Main.cs

/*using statements here*/
public void Main ()
{
  foo();
}

foo ()
{
  /*Some commands*/
}

bar()
{
  /*Never called*/
}

我的编译输出是否包含对 bar 的任何引用?

【问题讨论】:

    标签: .net visual-studio-2008 compilation c#-3.0


    【解决方案1】:

    C# 编译器将包含所有方法,甚至包括那些从未调用过的方法,即使它们是私有的。

    是的,编译后的输出定义了方法bar,它的主体被编译并出现在你的二进制文件中。

    这意味着您可以通过删除一个方法来破坏代码,即使结果可以编译:该方法只能通过反射调用。所以你在事后也做测试是对的。

    【讨论】:

    • 谢谢你。我以为是这样,但我觉得最好检查一下。
    • @JamieTaylor 如果你很好奇,你可以使用ILSpy 之类的工具查看二进制文件的内部,看看里面到底有什么。
    猜你喜欢
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多