#.net #vb.net #decompiling #decompiler #shorthand
#.net #vb.net #декомпиляция #декомпилятор #сокращение
Вопрос:
У меня есть следующий простой фрагмент объявления переменной класса с, сгенерированный декомпилятором
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
Ответ №1:
Как упоминал Холтерман, единственное преимущество, которое Interlocked.Exchange
предоставляет, — это барьер памяти. ( Int32
назначения в .NET всегда являются атомарными, и вы отбрасываете возвращаемое значение.)
Если исходный код был написан на C #, возможно, что он изначально содержал volatile
ключевое слово, которое также создает барьеры памяти.
private volatile int _Status;
public int Status
{
get { return _Status; }
set { _Status = value; }
}
Однако это должно было привести к тому, что в получателе также был сгенерирован барьер памяти.
Ответ №2:
Interlocked.Exchange(Me._Status, value)
-
Это уже однострочник, как вы думаете, насколько короче он может стать?
-
Единственным преимуществом использования Exchange (Int32) является возникающий при этом барьер памяти. Поэтому, когда вам это больше понравится, вы можете заменить его своим образцом
SyncLock
для того же эффекта.
Комментарии:
1. Но SyncLock декомпилируется на другой синтаксис, как указано в вопросе.
2. Итак, декомпиляторы делают выбор.