Вот мой сценарий.
В моей программе есть следующая строка кода:
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.