我一直试图在VB.NET中使用List(Of T)而不是那些必须没有命名的Robinson的ArrayLists。
基本上,我需要存储的是三件事:一个字符串,两个整数,也许两个布尔值。我喜欢使用ArrayList,因为它将所有元素都视为“对象”,所以我在存储各种元素时没有遇到任何问题。
但现在我一直在考虑使用List(Of T)。但是我该如何存储我的各种元素?我一直在考虑让Structure
持有五个元素。
听起来好主意?我听说结构预计寿命很短。但我担心,只要我的申请存在,我将永远拥有我的结构......这有什么不同吗?
最后,如果我需要创建......不知道...... 125,000,000个列表,每个都包含一个结构?这可能(并且很好)?
答案 0 :(得分:4)
如果您正在使用集合类型(ArrayList
或List(Of T)
),只是因为您正在寻找存储固定数量的完全不同类型的地方,请停止!您正在创建一个结构,但您正在寻找的是class
。
因为,从你的其他问题来看,听起来你正在创建一个地图编辑器,我假设你的两个数字是X和Y坐标,我猜这个字符串是某种名字?如果是这样,非常简单:
Public Class Tile
Public Property Name as String
Public Property X as Integer
Public Property Y as Integer
End Class
(请注意,只有在使用Visual Studio 2010和.NET 4时才能使用上述内容;如果没有,请回复,我将使用前4兼容版本进行编辑)
您可以更轻松地引用.X
和.Y
属性,而不仅仅是在整个地方抛出索引。与此相比,这也将更多(并占用更少的内存)。
我将放弃对那里所有东西的完整描述,因为对类的描述和属性是非常容易获得的。这有帮助吗?
答案 1 :(得分:1)
我肯定会放弃使用ArrayList
。为什么?因为仿制药是在很久以前的.NET 2.0版本中引入的,所以强类型List(Of T)
已经取代了大多数实际用途。
即使在你的情况下,我也会反对ArrayList
,因为你可以拥有一个更好,更容易访问的数据结构 - 例如,如下所示:
Structure CompositeValue ' or declare this as Class instead; see comment below!
Public Property SomeString() As String
Public Property FirstInteger() As Integer
Public Property SecondInteger() As Integer
Public Property MaybeFirstBoolean() As Nullable(Of Boolean)
Public Property MaybeSecondBoolean() As Nullable(Of Boolean)
End Structure
' Note that the above is the syntax for auto properties, which were introduced
' with VB.NET 10 / VS 2010.
优势:这样,您就不必记住,例如ArrayList
中您在哪个位置有字符串,或第二个整数值;编译器将能够确保您访问您认为正在访问的属性。此外,您的代码将更容易阅读和理解。
从.NET 4开始,您还可以使用 Tuple
(Of String, Integer, Integer, Nullable(Of Boolean), Nullable(Of Boolean))
:
Dim myCompositeValue = Tuple.Create("Foo", 1, 2, True, False)
但是,让我说元组不具备上述类结构等结构的所有优点;你得到类型安全,但你不能,例如为这五个属性提供合理的名称。 VB.NET中的元组不仅仅是一组类型安全的匿名值。