我使用ILSpy反映到LINQ's
Sum方法,并注意到它只是foreach
与checked
关键字。但是如果int
有一个已定义的最大值并且你试图重复它,为什么它默认不会抛出错误。假设您没有使用Sum
并且在没有foreach
的情况下执行自己的checked
,则不会出现异常,如果超过最大值,它只会给您一个垃圾值{ {1}}值,但我没有看到为什么这不仅仅是默认行为的原因。如果您需要大于int
的内容,请不要使用int
。
答案 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)
我没有看到为什么这不仅仅是默认行为
执行此类检查可能涉及成本 - 检查处理器标志,或者(如果在内部使用更大的寄存器)检查寄存器的高位内容。基本的分配可以是在最严格的循环内发生的操作 - 成本可能很明显,并不是每个人都应该付钱。
因此,您可以选择是否要进行这些检查。