今天早些時候,當我編寫一個方法時,它讓我吃了一驚,我不確定爲什麼我正在執行編譯的習慣用法。如果一切被抽象化了,它會是這個樣子:明確無限循環在.NET中處理爲特殊情況?
private int Example()
{
while (true)
{
if (some condition)
{
return 1;
}
}
}
你有一個明確的無限循環,有的一套導致循環用一個return語句結束循環內的條件。讓我們暫時忽略爲什麼我這樣做,而不是在while子句中檢查終止條件,因爲答案是複雜而且不相關的 - 我想知道的是爲什麼編譯器不會用「Not所有路徑都會返回一個值。「錯誤,嚴格地說,並非所有的路徑都會返回一個值。 while循環從不輸入(當然,這從來不會發生)的情況不會返回任何內容。
現在,我可以想象它發生了兩個原因:這是由於其他原因發生的優化的副作用,或者編譯器明確地處理此情況以允許此成語。我的直覺是,這可能是第一種情況。這並不讓我感到吃驚可言,比如,這個編譯:
private int Example2()
{
if (true) return 1;
}
因爲編譯器看到一個真正不變的,如果和條件遠優化。但我不明白爲什麼這會「修復」第一個例子。
哦,更古怪,如果一些優化是擺脫循環是在玩,這編譯:
private int Example3()
{
while (true)
{
if (false)
{
return 1;
}
}
}
我認爲整個內部循環將被優化掉,除暴安良所有有效的回報。在字節碼/編譯器級別實際發生了什麼,這一切都有意義嗎?
我覺得最後一個例子是編譯器的說法的情況下,*「我希望他們知道他們在做什麼.....「* – ChaosPandion
+1從未想過這些情況。 – Arun