在编写可以归结为以下的代码之后:

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

我很惊讶它扔了 OverFlowException. 。文档 OverFlowException 状态:

当检查上下文中的算术,铸造或转换操作导致溢出时,抛出的异常。

我看不到如何为此例外提供负面的大小和数组长度,因此更深入地研究了这一点,发现这确实是指定的行为:

尺寸长度的计算值如下验证。如果一个或多个值小于零,则会抛出一个系统。

我想知道为什么选择了溢出感。如果你问我,这很误导。这使我至少要进行5分钟的调查(在这里不计算我的沉思)。任何人都可以(对我的想法)奇特的设计决定提供任何启示吗?

有帮助吗?

解决方案

这几乎可以肯定是一种优化。 .NET框架代码非常虔诚地检查论点,以使程序员陷入成功。但这不是免费的。成本相当微小,许多课程方法的机器周期比在检查上花费的更多。

但是阵列很特别。它们是框架中的核心数据结构。几乎每个收藏班都建在上面。放入数组类中的任何开销都会直接影响位于其顶部的许多代码的效率。避免进行检查是可以的,当内部代码需要将值施放为未签名时,它会被隐式检查。而且很少有旅行。因此,检查两次不值得更好的例外消息。

其他提示

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

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

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

我可以看到这样的论点 grognal outofrangeException 在某些方面,可能是更好的 - 但是,数组定义没有任何论点(因为它不是一种方法),因此它也不是一个完美的选择。

这可能是因为该大小是一个未签名的int。它将-1存储在两个的补充中,当将其视为未签名的int时,它是可以存储的最大正整数。如果此数字大于数组的可能大小,则将溢出。

警告:这是纯粹的猜测。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top