默认属性集在VB.NET中被神秘地调用

时间:2012-04-02 20:16:44

标签: vb.net properties set default

这是我的情景。

我的程序中有以下代码行:

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

在我的测试中,我在这个JCL_History列表中有2个项目。当我调用我发布的第一行代码(调用Enqueue的代码)时,I = 1我希望第一项被洗牌到底部,第二项被洗牌到顶部。

在从排队的线程返回我注意到,这正是发生在我的名单,但是,如果我入队的执行我进入默认属性的设置方法后击中“step_in”按钮,其指数= 1和值=它将所有内容都搞砸了,因为拖拽到最后的项目(索引1)会被拖拽到顶部的项目值覆盖。

所以基本上默认属性上的set方法被调用,我认为这是一个非常荒谬的时间。是什么赋予了?顺便说一下,我在XP上运行VS2005。

2 个答案:

答案 0 :(得分:1)

您是否有手表和/或是否通过鼠标悬停执行快速手表,该手表会读取可能调用该套件的属性?如果您的调试环境评估了更改数据的内容,您可能会得到类似于您所描述的奇怪行为。

如果上述情况属实,若多个线程可以写入成员,请考虑使用ReaderWriterLockSlim

答案 1 :(得分:0)

没有答案。从来没有解决这个问题,只是解决了它。