Interlocked.Increment溢出会导致.NET运行时损坏吗?

Dou*_*las 7 .net c# overflow interlocked

状态的MSDN文档Interlocked.Increment:

此方法通过包装来处理溢出条件:if location = Int32.MaxValue,location + 1 = Int32.MinValue.没有异常被抛出.

在这种情况下," location + 1"是什么意思?如果Increment改变位置字段旁边的内存位置,那么这可能不会导致.NET运行时损坏,因为这个相邻的位置可能是任何东西(对象引用,类元数据等)?

Mic*_*haC 8

它只是意味着如果你想增加的值已经等于Int32.MaxValue并且你增加1而不是抛出错误,它就会返回Int32.MinValue

如果你这样做会发生同样的情况

var value = Int32.MaxValue;
value += 1;
Run Code Online (Sandbox Code Playgroud)

如果您明确要求抛出异常,请使用checked关键字

var value = Int32.MaxValue;
value = checked(value + 1);
Run Code Online (Sandbox Code Playgroud)

  • 只需提一下`value = checked(Interlocked.Increment(ref value));`如果value为int.MaxValue,则不会**抛出异常,它只是将它设置为int.MinValue (8认同)