为什么使用System.Threading.Interlocked.Decrement而不是减号?

swo*_*978 7 c# vb.net c#-to-vb.net

我将一些c#代码转换为vb.net,转换器.telerik.com转为:

i--;
Run Code Online (Sandbox Code Playgroud)

进入这个:

System.Math.Max(System.Threading.Interlocked.Decrement(i), i + 1)
Run Code Online (Sandbox Code Playgroud)

什么花哨的东西怎么样?

jas*_*son 10

MichałPiaskowski的评论引发了以下解释:

i--C#中的语义是返回当前值i(即减量发生前的值),然后减i1.

所以,我们需要将其转换为VB.我们不能使用,i -= 1因为这不会返回i减量前的当前值.所以,我们需要一个会递减的操作,i但会在递减i之前返回值,例如:

Function DoPostDecrement(ByRef i As Integer) As Integer
    i -= 1
    Return i + 1
End Function
Run Code Online (Sandbox Code Playgroud)

但这表明使用以下内容避免必须编写一个方法来执行上述操作:

System.Math.Max(
    someValueThatIsEqualToiMinusOne,
    someValueThatIsEqualtoiBeforeTheDecrement
)
Run Code Online (Sandbox Code Playgroud)

但VB.NET不会让你使用i -= 1i = i - 1代替someValueThatIsEqualToiMinusOne.但是,System.Threading.Interlocked.Decrement(i)是合法的,等于价值i - 1.一旦这样做,因为参数从左到右进行评估,someValueThatIsEqualtoiBeforeTheDecrement应该是i + 1(在那一点上,已经执行的减量i + 1是预减量值.

请注意,上述方法DoPostDecrementSystem.Math.Max, System.Threading.Interlocked.Decrement构造在多线程上下文中可能具有不同的语义.