调用Interlocked.Increment
后检查溢出的正确方法是什么?
我有一个ID生成器,在程序执行期间生成唯一ID,目前我测试它返回零的增量。
public static class IdGenerator {
private static int _counter = 0;
public static uint GetNewId() {
uint newId = (uint)System.Threading.Interlocked.Increment(ref _counter);
if (newId == 0) {
throw new System.Exception("Whoops, ran out of identifiers");
}
return newId;
}
}
鉴于我每次运行生成的ID数量相当大,可能(在特别大的输入上)_counter
在递增时会溢出,我想在这种情况下抛出异常(崩溃)早期轻松调试)。
此方法通过换行来处理溢出情况:if
location
=Int32.MaxValue
,location + 1
=Int32.MinValue
。没有例外。
答案 0 :(得分:4)
只需检查newId
是Int32.MinValue
(在转换为uint
之前)并抛出异常。
从增量中获取MinValue
的唯一方法是通过溢出。
答案 1 :(得分:0)
考虑使用unchecked
public static class IdGenerator
{
private static int _counter;
public static uint GetNewId()
{
uint newId = unchecked ((uint) System.Threading.Interlocked.Increment(ref _counter));
if (newId == 0)
{
throw new System.Exception("Whoops, ran out of identifiers");
}
return newId;
}
}
在这种情况下,你得到