This question already has answers here:
Why don't languages raise errors on integer overflow by default?
(8个答案)
Why doesn't C# use arithmetic overflow checking by default? [duplicate]
(2个答案)
6年前关闭。
我使用ILSpy反映了
结果:
未选中:241个刻度
已选中:1992 ticks
因此,使用检查结果会导致性能下降,并且由于溢出很少发生(实际上计数到
(8个答案)
Why doesn't C# use arithmetic overflow checking by default? [duplicate]
(2个答案)
6年前关闭。
我使用ILSpy反映了
LINQ's
Sum方法,并注意到它只是对foreach
关键字进行了checked
处理。但是,如果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");
结果:
未选中:241个刻度
已选中:1992 ticks
因此,使用检查结果会导致性能下降,并且由于溢出很少发生(实际上计数到
Int32.MaxValue
吗?),因此C#默认情况下使用未检查。