更新:我将保持原样:异常的性能命中率(非常罕见)比检查每个操作的性能命中率(常见)要好
我试图支持一个“EstimatedRowcount”,在一种情况下,它是两个连接在一起的子游标的乘积:

estimatedRowCount = left.EstimatedRowCount * right.EstimatedRowCount;
return estimatedRowCount;

当然,如果左和右足够大,这将抛出一个溢出异常。
在这里,我并不真正关心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来保护了?

最佳答案

这听起来是'unchecked' keyword的一个很好的用例。
要使用,只需将作业包装在“未选中”块中:

Int64 estimRowCount = 0;
unchecked
{
    estimRowCount = leftRowCount * rightRowCount;
}

然后测试结果是否为负-如果为负,则溢出:
if (estimRowCount > 0) estimRowCount = Int64.MaxValue;

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

08-18 09:43