2012-11-06 40 views
10

可能重複:
Why don’t languages raise errors on integer overflow by default?爲什麼C#默認不使用算術溢出檢查?

爲什麼不C#使用算術溢出默認檢查?

我認爲在發生這種情況時通常會更好地發生異常,這樣錯誤就不會被掩蓋。我知道利用發生的'包裝'行爲有時會很有用,但在這種情況下可以使用關鍵字unchecked來明確意圖。

我希望這個決定是故意做出的,也許是爲了提高與其他基於C語言的兼容性。

+2

性能.... – Mysticial

+4

可能出於性能原因 - 溢出檢查很慢,在絕大多數情況下不需要。 –

+0

@MichaelPetito,謝謝;這個問題似乎比這個更好,它有很好的答案,所以我認爲這應該是封閉的。 – Sam

回答

12

的C#語言規範這樣說:

對於非常量表達式(表達式,在 運行時求值),其不被任何checkedunchecked運營 或語句封閉,默認溢出檢查的上下文是unchecked 除非外部因素(如編譯器切換和執行 環境配置)調用checked評估。

這種選擇的原因可能是性能。我同意這個決定會導致那些不知道「無聲」整數溢出的人發生錯誤。

如果您的C#文件屬於C#項目文件(*.csproj),則該文件保存「默認」溢出檢查上下文的配置。要更改它,請參閱若要在Visual Studio開發環境this page中設置此編譯器選項。

如果您不使用.csproj文件,那麼您可能正在編譯命令行中的所有內容,然後上面的頁面會告訴您使用什麼命令行選項來設置默認溢出檢查上下文。

2

見我的答案在這裏類似的問題:Best way to handle Integer overflow in C#?

...有一個定義的 外表現如何檢查,未經檢查的處理的C#編譯器選項:/檢查。

默認行爲適用於大多數應用程序。對於其他應用程序,其中嚴格檢查應該是默認的,有一個編譯器選項來啓用這種行爲。

+0

感謝您花時間回答,但我問*爲什麼*而不是*如何*。 – Sam

+0

@Sam感謝downvoting相關的帖子,但對你的問題的微不足道的答案是「因爲微軟實施了它」...... – 2012-11-06 21:12:25

+1

@ H2CO3不,如果我正在設計一門語言,我也會默認在溢出時進行環繞。爲什麼?因爲溢出檢查的性能影響真的是**極端。 – Mysticial