溢出检查不起作用

时间:2013-01-17 10:52:15

标签: c# .net

我有以下代码,它将数字乘以60000,将分钟转换为毫秒。我已经实现了溢出检查,如下所示。我仍然得到以下代码分析交战。如何克服这个警告而不压制它?

  

警告:CA2233:纠正操作中的潜在溢出&session;会话超过百分比* 60' in' ApplicationSessionDAL.IsSessionExpired(短)'

注意:TimeSpan.TotalMilliseconds Property属于double数据类型

CODE

    public void IsSessionExpired(Int16 sessionExpiryValueInMinutes)
    {

        if (sessionExpiryValueInMinutes > (double.MaxValue) / 60000)
        {
            //Overflow check
            throw new ArgumentOutOfRangeException("sessionExpiryValueInMinutes");
        }
        else
        {
            //int milliSecondsValue  = sessionExpiryValueInMinutes * 60 * 1000;

            DateTime lastAccessTime = new DateTime(2013, 1, 1);
            TimeSpan elapsedTime = (DateTime.Now - lastAccessTime);
            if (elapsedTime.TotalMilliseconds > (sessionExpiryValueInMinutes * 60 * 1000))
            {
                bool isTimeExpired = true;
            }

        }

    }

参考

  1. Why is FxCop warning about an overflow (CA2233) in this C# code?

2 个答案:

答案 0 :(得分:5)

您可以将计算包装在checked块中。这样,程序将显式抛出一个System.OverflowException,您可以在这里抓住它来做你想要的。而且,既然你想要抛出异常,在你的特定情况下,你不需要做任何其他事情。

示例:

checked 
{
    if (elapsedTime.TotalMilliseconds > (sessionExpiryValueInMinutes * 60 * 1000))
    {
        bool isTimeExpired = true;
    }
}

@Oded是对的,FxCop不能总是那么聪明。

答案 1 :(得分:0)

我不确定,但我怀疑这意味着(sessionExpiryValueInMinutes * 60 * 1000)的结果永远不会保留在Int16中。

我看到你的代码存在另一个问题:我几乎可以肯定sessionExpiryValueInMinutes是一个Int16,永远不会大于(double.MaxValue)/ 60000。