2012-03-22 108 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