6

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

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

我很惊讶它抛出了一个OverflowExceptionOverflowException状态的文档:

当检查上下文中的算术、强制转换或转换操作导致溢出时引发的异常。

我看不出如何为这个异常提供负大小和数组长度,因此深入研究了一下,发现这确实是指定的行为:

尺寸长度的计算值验证如下。如果一个或多个值小于零,则抛出 System.OverflowException 并且不执行进一步的步骤。

我想知道为什么选择了 OverflowException。如果你问我,这很容易产生误导。这花了我至少 5 分钟的调查时间(这里不算我的沉思)。任何人都可以阐明这个(在我看来)特殊的设计决定吗?

4

3 回答 3

8

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

但是数组很特别。它们是框架中非常核心的数据结构。几乎每个集合类都建立在它们之上。Array 类中的任何开销都会直接影响其上的许多代码的效率。避免检查是可以的,当内部代码需要将值强制转换为无符号时,它会被隐式检查。它跳闸的情况非常罕见。所以检查它两次并不值得更好的异常消息。

于 2010-09-21T16:43:55.497 回答
5

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

产生超出数据类型范围的结果

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

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

于 2010-09-21T16:09:44.263 回答
1

这可能是因为该大小是无符号整数。它将 -1 存储在二进制补码中,当将其视为无符号整数时,它是可以存储的最大正整数。如果这个数字大于数组的可能大小,它将溢出。

警告:这是纯粹的猜测。

于 2010-09-21T16:06:14.050 回答