2

调用后检查溢出的正确方法是什么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。不会抛出异常。

4

2 回答 2

4

只需检查是否newIdInt32.MinValue(在转换为之前uint)并抛出异常。

MinValue从增量中获取的唯一方法是通过溢出。

于 2013-07-22T15:18:09.620 回答
1

考虑使用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;
    }
}

在这种情况下,您会得到

  1. 性能提升不大,因为编译器不会检查溢出。
  2. x2 钥匙空间
  3. 更简单更小的代码
于 2016-09-13T12:22:44.407 回答