为什么在默认情况下,将大于int的a值赋给int不会引发异常?
本文关键字:int 异常 情况下 默认 大于 为什么 | 更新日期: 2023-09-27 18:13:59
我使用ILSpy反映到LINQ's
Sum方法中,并注意到它只是使用checked
关键字执行foreach
。但是,如果一个int
有一个定义的最大值,并且您试图超过它,为什么默认情况下它不抛出错误呢?假设你不使用Sum
,你做自己的foreach
没有checked
,你不会得到一个异常,它只会给你一个垃圾值,如果你超过最大的int
值,但我不明白为什么这不仅仅是默认行为。如果你需要比int
更大的字符,那么就不要使用int
。
选中的操作明显比未选中的慢:
const int startVal = Int32.MaxValue - 1000000;
Stopwatch sw = new Stopwatch();
sw.Start();
int i = startVal;
while (i < Int32.MaxValue)
{
unchecked
{
i++;
}
}
sw.Stop();
Console.WriteLine("Unchecked: " + sw.ElapsedTicks + " ticks");
i = startVal;
sw.Restart();
while (i < Int32.MaxValue)
{
checked
{
i++;
}
}
sw.Stop();
Console.WriteLine("Checked: " + sw.ElapsedTicks + " ticks");
结果:Unchecked: 241 ticks
已检查:1992 ticks
所以使用checked会导致性能下降,而且由于溢出是相对罕见的(实际上算到Int32.MaxValue
?), c#默认使用unchecked
我不明白为什么这不是默认行为
执行这样的检查可能会有成本——检查处理器标志,或者(如果内部使用较大的寄存器)检查寄存器的上层内容。基本赋值可以是在最紧密的循环中进行的操作——代价可能是可观的,并不是每个人都应该付出代价。
你可以选择是否让这些检查发生