檢查未經檢查
checked
和 unchecked
關鍵字定義了操作如何處理數學溢位。checked
和 unchecked
關鍵字上下文中的溢位是指整數算術運算產生的值大於目標資料型別可以表示的值。
當 checked
塊中發生溢位時(或者當編譯器設定為全域性使用檢查算術時),將丟擲異常以警告不期望的行為。同時,在 unchecked
塊中,溢位是靜默的:沒有丟擲異常,並且值將簡單地環繞到相反的邊界。這可能導致細微,難以發現的錯誤。
由於大多數算術運算是在不大或不足以溢位的值上完成的,因此大多數情況下,不需要將塊明確定義為 checked
。在對可能導致溢位的無界輸入進行算術運算時需要小心,例如在遞迴函式中進行算術運算或在進行使用者輸入時。
checked
和 unchecked
都不會影響浮點算術運算。
當塊或表示式宣告為 unchecked
時,允許其中的任何算術運算溢位而不會導致錯誤。需要此行為的示例是計算校驗和,其中允許值在計算期間環繞:
byte Checksum(byte[] data) {
byte result = 0;
for (int i = 0; i < data.Length; i++) {
result = unchecked(result + data[i]); // unchecked expression
}
return result;
}
unchecked
最常見的用途之一是為 object.GetHashCode()
(一種校驗和)實現自定義覆蓋。你可以在此問題的答案中看到關鍵字的用法: 重寫的 System.Object.GetHashCode 的最佳演算法是什麼? 。
當塊或表示式宣告為 checked
時,任何導致溢位的算術運算都會導致 OverflowException
被丟擲。
int SafeSum(int x, int y) {
checked { // checked block
return x + y;
}
}
已檢查和未檢查可以是塊和表達形式。
已檢查和未檢查的塊不會影響被呼叫的方法,只會在當前方法中直接呼叫操作符。例如,Enum.ToObject()
,Convert.ToInt32()
和使用者定義的運算子不受自定義檢查/未檢查上下文的影響。
注意 :可以在專案屬性中或通過 / checked [+ | - ] 命令列開關更改預設溢位預設行為(已檢查與未檢查)。預設情況下,檢查除錯版本的操作是常見的,而對於版本版本則是未選中的操作。然後,只有在預設*方法不適用且需要明確行為以確保正確性的*情況下,才會使用 checked
和 unchecked
關鍵字。