2016-10-23 15 views
4

У меня есть следующий простой фрагмент объявления переменного класса с порожден декомпиляторСтенографии для Interlocked.Exchange в собственности сеттере

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 

ответ

3

Interlocked.Exchange(Me._Status, value)

  1. Это уже один вкладыш , насколько короче вы думаете, что он может получить?

  2. Единственное преимущество использования Exchange (Int32) - это барьер памяти, который он вызывает. Поэтому, когда вам это нравится, вы можете заменить его на ваш образец SyncLock для того же эффекта.

+0

Но SyncLock декомпилирует другой синтаксис, как указано в вопросе. –

+0

Итак, декомпиляторы делают выбор. –

3

Как отметил Холтерман, единственное преимущество, которое обеспечивает Interlocked.Exchange, - это барьер памяти. (Int32 задания всегда атомное в .NET, и вы отбрасывая возвращаемое значение.)

Если исходный код был написан на C#, то возможно, что он изначально содержал volatile ключевое слово, которое также создает барьеры памяти ,

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

Однако это должно было привести к возникновению барьера памяти в газопоглотителе.