2012-03-22 107 views
1

我很抱歉,如果这之前已经问过,或者现在是否可以回复。C#编译智能编译

我正在使用一个庞大的代码库(大部分是在开始编写它之前由其他软件工程师编写的,标准的事务)。我为这个项目添加了很多代码,其中大部分都是将现有的方法封装到对象/库中以便重用。通过包装,我的意思是我将它们复制到一个新的对象/库中,对它们进行编辑以使它们作为独立对象或库(在适用的情况下)工作,并在原始代码库中适当调用/实例化它们。例如,而不是一个巨大的方法(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*/ 
} 

难道我的编译输出包含任何引用吧?

回答

4

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

所以,编译后的输出定义了方法bar,它的主体被编译并存在于二进制文件中。

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

+0

谢谢你。我以为是这样,但我觉得最好检查一下。 – 2012-03-22 11:58:02

+0

@JamieTaylor如果你很好奇,你可以使用像[ILSpy](http://wiki.sharpdevelop.net/ILSpy.ashx)这样的工具来查看你的二进制文件,看看它里面的内容。 – 2012-03-22 12:04:31