编写可以归结为以下内容的代码后:
var size=-1;
var arr=new byte[size];
我很惊讶它抛出了OverflowException。 OverflowException状态的文档:
我看不到为此提供负的大小和数组长度如何适合此异常的描述,因此深入研究发现这确实是指定的行为:
我不知道为什么选择了OverflowException。如果你问我,这是很误导的。这花费了我至少5分钟的调查时间(此处未计算出我的想法)。任何人都可以对这个(我认为)独特的设计决策有所了解吗?
最佳答案
几乎可以肯定,这是一种优化。 .NET框架代码对于检查参数以使程序员落入成功之门非常虔诚。但这不是免费的。成本是微不足道的,许多类方法比检查花费的机器周期更多。
但是数组很特殊。它们是框架中最核心的数据结构。几乎每个集合类都建立在它们之上。 Array类中的任何开销都会直接影响位于其上的许多代码的效率。避免检查是可以的,当内部代码需要将该值强制转换为unsigned时,无论如何都会对其进行隐式检查。而且它跳闸非常罕见。因此,对其进行两次检查并不十分值得更好的异常消息。
关于c# - 用负数组大小引发OverflowException背后的理由吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3762060/