属性设置器中Interlocked.Exchange的简写

时间:2016-10-23 11:56:15

标签: .net vb.net decompiling decompiler shorthand

我有一个简单的变量声明,一个由反编译器生成的类

Friend Class Project
    Private _Status As Integer
    Public Property Status As Integer
        Get
            Return Me._Status
        End Get
        Set(ByVal value As Integer)
            Interlocked.Exchange(Me._Status, value)
        End Set
    End Property
End Class

此声明是否有任何简写形式。 实际上,这是在类内部使用的backgroundworker,并由另一个类在外部访问。

要清楚速记的含义是什么。我举个例子: 以下gode是简写

SyncLock lock
    z = 1
End SyncLock

以下详细代码

Dim obj As Object = Me.lock
ObjectFlowControl.CheckForSyncLockOnValueType(obj)
Dim flag As Boolean = False
Try
    Monitor.Enter(obj, flag)
    Me.z = 1
Finally
    If (flag) Then
        Monitor.[Exit](obj)
    End If
End Try

2 个答案:

答案 0 :(得分:4)

正如霍尔特曼所提到的,Interlocked.Exchange提供的唯一好处是记忆障碍。 (Int32赋值在.NET中始终是原子的,并且您要丢弃返回值。)

如果源代码是用C#编写的,那么它最初可能包含volatile关键字,这也会产生内存障碍。

private volatile int _Status;
public int Status
{
    get { return _Status; }
    set { _Status = value; }
}

但是,这应该会导致在getter中生成内存屏障。

答案 1 :(得分:3)

  

Interlocked.Exchange(Me._Status, value)

  1. 它已经是单行,您认为可以缩短多少?

  2. 使用Exchange(Int32)的唯一好处是它导致的内存屏障。因此,当您更喜欢它时,您可以使用样本SyncLock替换它以获得相同的效果。