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反映了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#默认情况下使用未检查。

09-11 19:22
查看更多