如何在C#中优雅地测试溢出情况?

如何在C#中优雅地测试溢出情况?,c#,exception,math,exception-handling,C#,Exception,Math,Exception Handling,更新:我将保持原样:异常的性能命中(非常罕见)比检查每个操作的性能命中(常见)要好 我试图支持“EstimatedRowCount”,在一种情况下,它是两个子游标连接在一起的产物: estimatedRowCount = left.EstimatedRowCount * right.EstimatedRowCount; return estimatedRowCount; 当然,如果左侧和右侧足够大,这将抛出OverflowException 在这里,我并不关心estimatedRowCoun

更新:我将保持原样:异常的性能命中(非常罕见)比检查每个操作的性能命中(常见)要好


我试图支持“EstimatedRowCount”,在一种情况下,它是两个子游标连接在一起的产物:

estimatedRowCount = left.EstimatedRowCount * right.EstimatedRowCount;
return estimatedRowCount;
当然,如果左侧和右侧足够大,这将抛出OverflowException

在这里,我并不关心estimatedRowCount是否100%准确,只是足够大,可以知道这个游标保存了大量数据

现在,我正在这样做:

// We multiply our rowcount
Int64 estimRowCount = 0;
try
{
    estimRowCount = leftRowCount * rightRowCount;
}
catch (OverflowException)
{
    // Ignore overflow exceptions
    estimRowCount = Int64.MaxValue;
}

return estimRowCount;

有没有更好的方法来测试溢出操作,这样我就不必执行try{}catch to guard了?

您的解决方案似乎很合理。您是否需要优化某些特定的内容?该产品是否频繁导致溢出情况,以至于您担心异常处理的性能受到影响

(简单地说,如果leftRowCount和rightRowCount是Int32而不是Int64,那么您的产品就不能溢出Int64 estimRowCount左值。)



if(Int64.MaxValue/leftRowCount这听起来像是一个很好的应用案例

要使用,只需将作业包装在“未选中”块中:

Int64 estimRowCount = 0;
unchecked
{
    estimRowCount = leftRowCount * rightRowCount;
}
然后测试结果是否为阴性-如果为,则溢出:

if (estimRowCount > 0) estimRowCount = Int64.MaxValue;

在这种情况下,您需要确保leftRowCount和rightRowCount都不能为负值,但考虑到上下文,我认为不会出现这种情况。

一切都是Int64。从“避免意外处理命中”的理念中学习,这可能是“过早优化”如果可以的话。那么现在的问题是,在每次计算中检查这一点是否比处理未命中的例外情况更有效。对此不确定。但为什么你会担心像这样的小事?我肯定他会担心像这样的小事,因为如果这是在一个紧密的循环中运行,那么小事就会变成大事不过我也喜欢你的建议。出于好奇,我想用一个高精度计时器来测试这两个变体。这是一个晦涩难懂的语言特性,除非你需要它,否则你永远不会知道
if (estimRowCount > 0) estimRowCount = Int64.MaxValue;