使用负数组大小抛出OverflowException背后的基本原理?

时间:2010-09-21 15:51:57

标签: c# arrays specifications overflowexception

编写可归结为以下内容的代码后:

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

我很惊讶它扔了OverflowExceptionOverflowException州的文档:

  

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分钟的调查时间(不计算我的思考)。任何人都可以(根据我的想法)对这个特殊的设计决定有所了解吗?

3 个答案:

答案 0 :(得分:8)

这几乎可以肯定是一种优化。 .NET框架代码非常虔诚地检查参数,让程序员陷入成功之中。但这不是免费的。成本相当微小,许多类方法比检查花费的机器周期多得多。

但阵列很特别。它们是框架中非常核心的数据结构。几乎每个集合类都建立在它们之上。放入Array类的任何开销都会直接影响其上的大量代码的效率。避免检查是可以的,当内部代码需要将值转换为unsigned时,它会被隐式检查。它的出行非常罕见。因此,检查它两次并不值得更好的异常消息。

答案 1 :(得分:5)

OverflowException,在文档中,基本上将溢出定义为:

  

产生的结果超出了数据类型

的范围

在这种情况下,负值超出了数组大小的有效范围(或者实际上,任何大小)。

我可以看到ArgumentOutOfRangeException可能在某些方面更好的论点 - 然而,数组定义中没有参数(因为它不是一个方法),所以它也不会一个完美的选择。

答案 2 :(得分:1)

可能是因为该大小是unsigned int。它将-1存储为二进制补码,当它被视为无符号整数时,是可以存储的最大正整数。如果此数字大于数组的可能大小,则会溢出。

警告:这是纯粹的推测。