3

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

4

2 回答 2

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# 默认使用未检查。

于 2013-05-17T13:02:25.670 回答
2

我看不出这不仅仅是默认行为的原因

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

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

于 2013-05-17T12:59:22.213 回答