Набор свойств по умолчанию вызывается таинственным образом в VB.NET - PullRequest
1 голос
/ 03 апреля 2012

Вот мой сценарий.

В моей программе есть следующая строка кода:

JCL_History.Enqueue(JCL_History(I))

Этот объект JCL_History в основном является Generic.List, инкапсулированным в оболочку, и имеет следующий метод:

Public Sub Enqueue(ByRef value As String)
    If Members.Contains(value) Then
        Me.RemoveAt(Members.IndexOf(value))
    ElseIf _Count = _MaxCount Then
        Me.RemoveAt(_Count - 1)
    End If
    Me.Insert(0, value)
End Sub

Итак, вы видите, что первая строка кода, которая вызывает Enqueue, должна «перемешивать» элементы вокруг.

Кроме того, класс-оболочка, типом которой является JCL_History, имеет следующее свойство по умолчанию:

Default Public Property Item(ByVal Index As Integer) As String 'Implements Generic.IList(Of String).Item
    Get
        If Index < _MaxCount Then
            Return Members(Index)
        Else
            Throw New IndexOutOfRangeException("Bug encountered while accessing job command file history, please send an error report.")
        End If
    End Get
    Set(ByVal value As String)
        If Index < _MaxCount Then
            If Index = _Count Then _Count = _Count + 1
            Members(Index) = value
        Else
            Throw New IndexOutOfRangeException("Bug encountered while accessing job command file history, please send an error report.")
        End If
    End Set
End Property

В моем тестировании у меня есть 2 элемента в этом списке JCL_History. Когда я вызываю ту первую строку кода, которую я разместил (ту, которая вызывает Enqueue) с I = 1, я ожидаю, что первый элемент будет перетасовываться вниз, а второй - перетасовываться вверх.

После того, как поток возвращается из Enqueue, я замечаю, что это именно то, что происходит с моим списком. ОДНАКО, если я нажму кнопку "step_in" после выполнения Enqueue, я перехожу к методу set свойства Default, где Index = 1 и value = и все портит, потому что элемент, который был перетасован до конца (индекс 1), перезаписывается значением элемента, перетасованным до верха.

Так что в основном метод set для свойства default вызывается в то время, которое я считаю совершенно нелепым. Что дает? Кстати, я использую VS2005 на XP.

Ответы [ 2 ]

1 голос
/ 11 апреля 2012

Есть ли у вас часы и / или выполняете ли вы быстрые часы при наведении мыши, чтобы прочитать свойство, которое может вызывать Set? Если ваша среда отладки оценивает что-то, что изменяет данные, вы можете получить странное поведение, подобное тому, что вы описываете.

Является ли приведенный выше случай истинным, если несколько членов могут писать членам, рассмотрите возможность использования ReaderWriterLockSlim .

0 голосов
/ 03 ноября 2012

нет ответа.Никогда не исправил, просто работал вокруг него.

...