如何在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;