List(Of T)声明和.add的奇怪问题

时间:2010-12-16 15:21:55

标签: vb.net

我的代码(.Net Framework 3.5)中存在这个非常奇怪的问题。所以,在一个普通的VB.NET程序中,我会做这样的事情:

Dim MyList As New List(Of Integer) 

MyList.Add(3)

MyList.Add(5)

MyList.Add(9)

MyList.Add(17)

如果我在

之后设置了“休息”
Dim MyList As New List(Of Integer)

并在代码暂停时将鼠标放在“MyList”上,我应该得到:Count = 0。但是,我有一个子,我在那里创建一个列表并得到(当我在它之后打破):“Count =属性评估失败”。

好像我的列表没有足够的空间容纳数据......这是我用来尝试所有内容的完整代码(顺便说一句,代码本身并没有真正意义,因为它是我的一部分项目)。有了它,我可以创造“怪异”的行为,任何人都可以测试这个。这是代码(抱歉代码块按钮不起作用):

Structure lPossibilitiesOutputStruct 

     Dim Pinion As GearOutputStruct

     Dim Gear As GearOutputStruct

     Dim Forces As ForcesStruct

     Dim CenterDistance As Double

     Dim Pitch As Double

     Dim lStagePossibilities As List(Of lPossibilitiesOutputStruct)

End Structure

Structure GearOutputStruct

     Dim TeethNbr As Integer

     Dim RPM As Double

     Dim FaceWidth As Double

     Dim OutsideDiameter As Double

     Dim Addendum As Double

     Dim WholeDepth As Double

     Dim OperatingPitchDiameter As Double

     Dim OverPinData As OverPinOutputStruct

     Dim SpanData As SpanOutputStruct

     Dim AllowableBendingPower As Double

     Dim AllowablePittingPower As Double

End Structure

Structure OverPinOutputStruct

     Dim PinDiameter As Double

     Dim OverpinMeasurement As Double

End Structure

Structure SpanOutputStruct

     Dim TeethNbr As Integer

     Dim SpanMeasurement As Double

End Structure

Structure ForcesStruct

     Dim GearSetAxialForce As Double

     Dim GearSetRadialForce As Double

     Dim GearSetTangentialForce As Double

End Structure

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     Dim lStagePossibilities As New List(Of lPossibilitiesOutputStruct)

     Dim MyList As New List(Of Integer)

     MyList.Add(3)

     MyList.Add(5)

     MyList.Add(9)

     MyList.Add(17)

     lStagePossibilities = lGeneratePossibilities(Nothing, Nothing, 3, 1)

End Sub

Private Function lGeneratePossibilities(ByVal ActualStage As lPossibilitiesOutputStruct, ByVal CSL As List(Of Integer), ByVal MaxStage As Integer, ByVal CumulatedRatio As Double) As List(Of lPossibilitiesOutputStruct)

     Return Nothing

End Function

我所做的只是使用表单创建一个新项目并创建该代码。项目中没有别的东西。我玩“目标CPU”,这就是......

如果我使用编译选项运行该程序以使用x86 CPU,并在“lStagePossibilities = ...”上暂停,当我将鼠标放在MyList上时,我得到“Count =属性评估失败”。如果我用x64 CPU运行它,那么一切正常......(“Count = 4”)。如果我回到x86 CPU,我会收回错误。更糟糕的是,如果我在lPossibilitiesOutPutStruct结构声明中注释“Dim Pinion as GearOutputStruct”或“Dim Gear as GearOutputStruct”或“Dim Forces as ForcesStruct”这一行,那么一切都可以正常使用x86 CPU ...

它可能与列表的最大大小有关吗???

谢谢!

1 个答案:

答案 0 :(得分:2)

我敢打赌,如果你把一些Strucures改成了Classes,问题就会消失。 Visual Studio中的一个众所周知的错误是,当Structures变大并尝试分配大量本地内存时,调试器中的内容会变坏。一些结构包含其他结构,内存相加。我打赌在x64中,由于打包,结构的大小变大了。

引用一些 MSDN 博客

  

其他人也知道。这个问题是因为我的代码中的结构也很大。我把它转换成了一个类,我可以读取悬停在对象上的变量的值。它在一些函数和类中起作用,但是包含大型结构的错误消息具有错误“无法计算表达式,因为线程在无法收集垃圾的位置停止,可能是因为代码已经优化”。在改变之后就消失了。希望它有助于确认解决方案。

     

澄清一下,太大了。我的结构(而非)......

     
      
  • 55个公共变量
  •   
  • 具有6个参数的构造函数
  •   
  • 两个公共函数(其中一个很小,一个很大,大约200行代码)
  •   
     

我认为结构体旨在用作直接,简单,有凝聚力的数据和功能的小容器,我同意这个结果太过分了。当然,它开始很小,而且需求激增。现在它已经在一个现在包含有凝聚力的数据和功能的类中,我可以在晚上睡觉。 =)

     

我花了5分钟把它转换成了一个班级。很容易。