2010-09-21 21 views
6

編寫可以歸結爲以下代碼後:拋出負數組大小的OverflowException背後的原理?

var size=-1; 
var arr=new byte[size]; 

我很驚訝,它拋出一個OverflowException。爲OverflowException狀態的文檔:

The exception that is thrown when an arithmetic, casting, or conversion operation in a checked context results in an overflow.

我看不出如何提供一個負的大小和數組長度適合此異常給出的描述,所以鑽研得更深,發現這確實是指定的行爲:

The computed values for the dimension lengths are validated as follows. If one or more of the values are less than zero, a System.OverflowException is thrown and no further steps are executed.

我想知道爲什麼選擇了OverflowException。如果你問我,這很容易讓人誤解。這花費了我至少5分鐘的調查時間(不包括我在這裏的沉思)。任何人都可以在這個(對我的想法)特殊的設計決定?

+0

似乎有理由拋出這個例外給我。 – cjk 2010-09-21 16:02:20

+0

它是如何溢出任何描述? – spender 2010-09-21 16:02:51

回答

8

這幾乎肯定是一種優化。 .NET框架代碼在檢查參數方面非常虔誠,讓程序員陷入了成功的坑坑中。但這不是免費的。成本相當微不足道,許多類方法需要比檢查花費更多的機器週期。

但是數組是特殊的。它們是框架中非常核心的數據結構。幾乎每個集合類都建立在它們之上。 Array類中的任何開銷直接影響了許多位於其上的代碼的效率。避免檢查可以,當內部代碼需要將值轉換爲無符號時,它會被隱式檢查。它出行非常罕見。因此,檢查兩次並不值得提供更好的異常消息。

1

這可能是因爲該大小是一個無符號整數。它將-1存儲在二進制補碼中,當它看作無符號整數時,它是可以存儲的最大正整數。如果這個數字大於數組的可能大小,它會溢出。

警告:這是純粹的猜測。

+0

.NET中的數組大小存儲爲Int32,而不是無符號數。我相信這是爲了保持數組符合CLS。 – 2010-09-21 16:10:18

+0

我原本是按照這些思路思考的,但規範非常具體,它是負面大小導致此異常。 – spender 2010-09-21 16:11:27

5

OverflowException,在文檔中,基本上是一個溢流定義爲東西:

產生的結果是數據類型

在這種情況下的範圍之外,負值超出數組大小(或者真的,任何大小)的有效範圍。

我可以看到ArgumentOutOfRangeException在某些方面可能更好 - 但是,數組定義中沒有參數(因爲它不是一種方法),所以它也不是一個完美的選擇。

相關問題