Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.NET中神秘调用的默认属性集_Vb.net_Properties_Set_Default - Fatal编程技术网

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

在VB.NET中神秘调用的默认属性集,vb.net,properties,set,default,Vb.net,Properties,Set,Default,这是我的设想 我的程序中有以下代码行: JCL_History.Enqueue(JCL_History(I)) 此JCL_历史对象基本上是封装在包装器中的泛型.List,具有以下方法: Public Sub Enqueue(ByRef value As String) If Members.Contains(value) Then Me.RemoveAt(Members.IndexOf(value)) ElseIf _Count = _MaxCount Then

这是我的设想

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

JCL_History.Enqueue(JCL_History(I))
此JCL_历史对象基本上是封装在包装器中的泛型.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
Default Public Property Item(ByVal索引为整数)As String'实现Generic.IList(Of String).Item
得到
如果索引<\u最大计数,则
返回成员(索引)
其他的
抛出新的IndexOutOfRangeException(“访问作业命令文件历史记录时遇到错误,请发送错误报告。”)
如果结束
结束
设置(ByVal值作为字符串)
如果索引<\u最大计数,则
如果索引=\u计数,则\u计数=\u计数+1
成员(索引)=值
其他的
抛出新的IndexOutOfRangeException(“访问作业命令文件历史记录时遇到错误,请发送错误报告。”)
如果结束
端集
端属性
在我的测试中,JCL_历史记录列表中有两项。当我用I=1调用我发布的第一行代码(调用Enqueue的代码)时,我希望第一个项目被洗牌到底部,第二个项目被洗牌到顶部

线程从排队返回后,我注意到这正是我的列表发生的情况,但是如果我在执行排队后点击“step_in”按钮,我会进入默认属性的set方法,其中Index=1和value=1,它会把一切都搞糟,因为被洗牌到末尾的项(索引1)被移到顶部的项值覆盖


所以基本上默认属性上的set方法在我认为完全荒谬的时候被调用。有什么好处?顺便问一下,我正在XP上运行VS2005。

您是否有手表和/或通过鼠标在上面执行快速手表,该手表将读取可能调用集合的属性?如果您的调试环境评估了一些更改数据的内容,您可能会得到一些奇怪的行为,如您所描述的


上述情况是否正确,如果多个线程可以写入成员,请考虑使用.< /P> < P>是否有一个表和/或通过鼠标读取一个可能调用该属性的属性执行快速监视?如果您的调试环境评估了一些更改数据的内容,您可能会得到一些奇怪的行为,如您所描述的


上述情况是否正确,如果多个线程可以写入成员,请考虑使用.< /P> < P>无应答。从未解决过这个问题,只是解决了它。

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

你能发布一个重现这种行为的调用示例吗。您声明“线程返回后”,是否正确锁定了插入和删除项的调用周围的集合。在调用堆栈进入setter时发布您看到的调用堆栈。删除
Default
语句并查看未编译的内容。在重新引入
Default
之前,当您不想首先调用它时,尝试显式调用它。哦,它太陈旧了。我只是将属性设置为只读,它在不更改任何其他代码的情况下解决了问题。我想我可以回去重现这个问题,但它似乎不再值得了。我记得我检查了很多次调用堆栈,它总是正常的。当我中断Set调用并检查调用堆栈时,它位于Enqueue调用,但是当我遍历代码时,我看到线程在进入Set调用之前从Enqueue调用返回。因此,在调用Set的排队调用之后有一条看不见的线。你能举一个调用的例子来重现这种行为吗。您声明“线程返回后”,是否正确锁定了插入和删除项的调用周围的集合。在调用堆栈进入setter时发布您看到的调用堆栈。删除
Default
语句并查看未编译的内容。在重新引入
Default
之前,当您不想首先调用它时,尝试显式调用它。哦,它太陈旧了。我只是将属性设置为只读,它在不更改任何其他代码的情况下解决了问题。我想我可以回去重现这个问题,但它似乎不再值得了。我记得我检查了很多次调用堆栈,它总是正常的。当我中断Set调用并检查调用堆栈时,它位于Enqueue调用,但是当我遍历代码时,我看到线程在进入Set调用之前从Enqueue调用返回。这就像是排队呼叫后有一条看不见的线,叫做Set。不,我没有用手表。如果我是,我想我将能够看到集合从具有可理解堆栈跟踪的线程中被调用,而不是看到它在从Enqueue函数返回后立即神秘地被调用。不,我没有使用任何手表。如果我是,我想我将能够看到从具有可理解堆栈跟踪的线程调用集合,而不是看到在从Enqueue函数返回后立即神秘地调用集合。