說我有兩種方法,一種叫另一種。第二種方法的代碼會產生編譯時錯誤。既然它沒有被調用,爲什麼編譯器仍然懶得去處理它呢?爲什麼c#編譯器仍然從未使用的方法讀取編譯代碼?
void method1()
{
var i = 1;
//method2();
}
void method2()
{
int i = "2";
}
說我有兩種方法,一種叫另一種。第二種方法的代碼會產生編譯時錯誤。既然它沒有被調用,爲什麼編譯器仍然懶得去處理它呢?爲什麼c#編譯器仍然從未使用的方法讀取編譯代碼?
void method1()
{
var i = 1;
//method2();
}
void method2()
{
int i = "2";
}
您不能確定別人不會在運行時使用反射調用該方法。你的代碼必須編譯或者它不是有效的代碼 - 如果它從未被使用過......將它註釋掉!
進一步來說:
基本上你是強類型的編譯時間 - .NET將鍵入檢查一切,確保你正在試圖做的是合法的,但是,你仍然可以在運行時拋出異常由於空引用,不良鑄件等等
思考是.NET框架,它允許開發者經由集元數據
反射允許檢查一個組件類型的屬性/字段/方法等等的部件運行時類型發現和這些類型的檢查,它也允許調用方法/屬性和字段的修改等等(你甚至可以在運行時創建新的通用類型或完全新的類型)。
換句話說,你不能保證你的代碼認爲不會被調用,不會在某個地方被調用。爲使反思成爲可能,每一位代碼都需要有效且可編譯
代碼在運行時是否會成功是另一回事 - 但這就是我們進行異常處理的原因。
不要評論它!這留下了可怕的遺留代碼。刪除它! – 2012-07-25 14:38:52
我想這取決於你是否正在修復它,並需要在稍後的日期修復它。但開發人員真的有時間:D – Charleh 2012-07-25 14:40:41
然後如果其他人稍後使用您的編譯代碼並決定使用它呢?
即使使用私有方法反射也會使事情複雜化。
如果您不使用它,請將其丟失。 (或至少註釋掉)
我不關心這個例子,說明未來可能會發生什麼,也可能不會發生在另一個程序員身上。除非這種「預警」是編譯器爲什麼要處理未被調用的方法的原因。 – 2012-07-25 14:42:31
僅僅因爲你不關心,並不意味着編譯器應該讓它通過未經檢查。編譯器應該如何知道你打算在以後做什麼。另外,爲什麼留下不能編譯的存根代碼?正確的行爲是拋出新的NotImplementedException。 – KingCronus 2012-07-25 14:51:22
編譯器不能保證它永遠不會被調用。此外,你真的不想留下這樣的錯誤,只會讓他們以後再回來咬你。 – BoltClock 2012-07-25 14:33:28
它不能保證它永遠不會被調用,但它知道(我假設這是)它現在沒有被調用。所以我想我很好奇爲什麼編譯器不會跳過它,直到有方法的已知調用。拋開代碼或實踐的質量,嚴格來自編譯器的pov。 – 2012-07-25 14:39:01
編譯器不能認爲它沒有被稱爲「現在」。 – BoltClock 2012-07-25 14:42:05