在属性setter中Interlocked.Exchange的简写方式

4
我有以下简单的变量声明,是反编译生成的类:
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,在另一个类中被外部访问。

为了清楚起见,“缩写”的意思我举个例子: 以下代码是一种缩写

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个回答

4
如Holterman所提到的,Interlocked.Exchange提供的唯一好处是内存屏障。(在.NET中,Int32赋值始终是原子的,并且您正在丢弃返回值。)
如果源代码是用C#编写的,则可能最初包含volatile关键字,该关键字还会生成内存屏障。
private volatile int _Status;
public int Status
{
    get { return _Status; }
    set { _Status = value; }
}

然而,这应该会在getter中生成一个内存屏障。

3

Interlocked.Exchange(Me._Status, value)

  1. 这已经是一个一行代码了,你认为能缩短多少?

  2. 使用 Exchange(Int32) 的唯一好处是它引起的内存屏障。因此,如果您更喜欢它,您可以用您的示例 SyncLock 替换它以获得相同的效果。


但是,如问题中所述,SyncLock反编译为不同的语法。 - Eslam Sameh Ahmed
所以,反编译器会做出选择。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接