我有一个简单的变量声明,一个由反编译器生成的类
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
答案 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)
它已经是单行,您认为可以缩短多少?
使用Exchange(Int32)的唯一好处是它导致的内存屏障。因此,当您更喜欢它时,您可以使用样本SyncLock
替换它以获得相同的效果。