2012-07-25 9 views
1

說我有兩種方法,一種叫另一種。第二種方法的代碼會產生編譯時錯誤。既然它沒有被調用,爲什麼編譯器仍然懶得去處理它呢?爲什麼c#編譯器仍然從未使用的方法讀取編譯代碼?

void method1() 
{ 
    var i = 1; 
    //method2(); 
} 

void method2() 
{ 
    int i = "2"; 
} 
+4

編譯器不能保證它永遠不會被調用。此外,你真的不想留下這樣的錯誤,只會讓他們以後再回來咬你。 – BoltClock 2012-07-25 14:33:28

+0

它不能保證它永遠不會被調用,但它知道(我假設這是)它現在沒有被調用。所以我想我很好奇爲什麼編譯器不會跳過它,直到有方法的已知調用。拋開代碼或實踐的質量,嚴格來自編譯器的pov。 – 2012-07-25 14:39:01

+0

編譯器不能認爲它沒有被稱爲「現在」。 – BoltClock 2012-07-25 14:42:05

回答

10

您不能確定別人不會在運行時使用反射調用該方法。你的代碼必須編譯或者它不是有效的代碼 - 如果它從未被使用過......將它註釋掉!

進一步來說:

基本上你是強類型的編譯時間 - .NET將鍵入檢查一切,確保你正在試圖做的是合法的,但是,你仍然可以在運行時拋出異常由於空引用,不良鑄件等等

思考是.NET框架,它允許開發者經由集元數據

反射允許檢查一個組件類型的屬性/字段/方法等等的部件運行時類型發現和這些類型的檢查,它也允許調用方法/屬性和字段的修改等等(你甚至可以在運行時創建新的通用類型或完全新的類型)。

換句話說,你不能保證你的代碼認爲不會被調用,不會在某個地方被調用。爲使反思成爲可能,每一位代碼都需要有效且可編譯

代碼在運行時是否會成功是另一回事 - 但這就是我們進行異常處理的原因。

+2

不要評論它!這留下了可怕的遺留代碼。刪除它! – 2012-07-25 14:38:52

+0

我想這取決於你是否正在修復它,並需要在稍後的日期修復它。但開發人員真的有時間:D – Charleh 2012-07-25 14:40:41

1

然後如果其他人稍後使用您的編譯代碼並決定使用它呢?

即使使用私有方法反射也會使事情複雜化。

如果您不使用它,請將其丟失。 (或至少註釋掉)

+0

我不關心這個例子,說明未來可能會發生什麼,也可能不會發生在另一個程序員身上。除非這種「預警」是編譯器爲什麼要處理未被調用的方法的原因。 – 2012-07-25 14:42:31

+1

僅僅因爲你不關心,並不意味着編譯器應該讓它通過未經檢查。編譯器應該如何知道你打算在以後做什麼。另外,爲什麼留下不能編譯的存根代碼?正確的行爲是拋出新的NotImplementedException。 – KingCronus 2012-07-25 14:51:22