为什么在默认情况下,将大于int的a值赋给int不会引发异常?

本文关键字:int 异常 情况下 默认 大于 为什么 | 更新日期: 2023-09-27 18:13:59

我使用ILSpy反映到LINQ's Sum方法中,并注意到它只是使用checked关键字执行foreach。但是,如果一个int有一个定义的最大值,并且您试图超过它,为什么默认情况下它不抛出错误呢?假设你不使用Sum,你做自己的foreach没有checked,你不会得到一个异常,它只会给你一个垃圾值,如果你超过最大的int值,但我不明白为什么这不仅仅是默认行为。如果你需要比int更大的字符,那么就不要使用int

为什么在默认情况下,将大于int的a值赋给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

我不明白为什么这不是默认行为

执行这样的检查可能会有成本——检查处理器标志,或者(如果内部使用较大的寄存器)检查寄存器的上层内容。基本赋值可以是在最紧密的循环中进行的操作——代价可能是可观的,并不是每个人都应该付出代价。

你可以选择是否让这些检查发生