为什么默认情况下为int赋值大于int的值不抛出异常?

时间:2013-05-17 12:50:48

标签: c# .net

我使用ILSpy反映到LINQ's Sum方法,并注意到它只是foreachchecked关键字。但是如果int有一个已定义的最大值并且你试图重复它,为什么它默认不会抛出错误。假设您没有使用Sum并且在没有foreach的情况下执行自己的checked,则不会出现异常,如果超过最大值,它只会给您一个垃圾值{ {1}}值,但我没有看到为什么这不仅仅是默认行为的原因。如果您需要大于int的内容,请不要使用int

2 个答案:

答案 0 :(得分:4)

已检查的操作明显慢于未选中的操作:

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");

结果:

  

未选中:241刻度
  检查:1992年滴答

因此,在性能损失中使用检查结果,并且因为溢出相对较少(实际上最多计算到Int32.MaxValue?),C#默认情况下使用未选中。

答案 1 :(得分:2)

  

我没有看到为什么这不仅仅是默认行为

执行此类检查可能涉及成本 - 检查处理器标志,或者(如果在内部使用更大的寄存器)检查寄存器的高位内容。基本的分配可以是在最严格的循环内发生的操作 - 成本可能很明显,并不是每个人都应该付钱。

因此,您可以选择是否要进行这些检查。