在阵列中正确存储对象
我知道这可能是一个愚蠢的问题,但它是一个非常大的交易,所以我想确保我做得很好。这个可以吗?在阵列中正确存储对象
Dim obj as MyObj
Dim objarr as New Arraylist
For x as Integer = 1 to 10
obj = New MyObj
obj.SomeValue = x
objarr.add(obj)
Next
该数组是否将包含所有单独的对象或将它们都包含相同的对象?我是否通过使用相同的MyObj对象添加到列表中来犯错误? 谢谢
您通常在循环之外声明收集列表。我对此采取:
Dim objarr as New Generic.List(Of MyObj)
For x as Integer = 1 to 10
objarr.add(New MyObj With {.SomeValue = x})
Next
这里是我用于测试目的的一类:
Private Class MyObj
Public Property SomeValue As Integer
End Class
非常好的代码。很显然,你在我之前就已经很开心了。 Of关键字引发我一个循环。我想用它更好,所以你将来不需要使用DirectCast来获取对象?为什么使用“财产”,当我可以做公共x为整数? – wayofthefuture 2013-03-13 22:58:05
@scuzzlebuzzle:泛型也为您提供捕获大多数编译时错误的好处,这完全是因为没有运行时转换。 .NET框架似乎比字段对属性有更好的支持。 IIRC,它们的默认数据绑定不能映射到字段上,所以你需要使用属性。在你的情况下,要么工作得很好。 – Neolisk 2013-03-13 23:40:05
如果您将其设为公共字段(例如'Public SomeValue As Integer'),则无法控制其吸气和吸气装置。所以,如果你需要这样做,你将不得不将它从一个领域改变成一个属性。当你这样做时,它会改变该类的公共接口(因为IL中的字段和属性处理方式非常不同)。因此,任何其他使用该类的程序集都需要重新编译,否则应用程序将会中断。因此,通常建议将所有属性预先设置好,以防万一。 – 2013-03-14 00:48:21
您只重用MyObj变量 - 将其视为容器。每次调用此行
obj = New MyObj
您正在创建MyObj中的新instance
;因此,您的ArrayList将包含MyObj的10个不同实例。
谢谢大卫 – wayofthefuture 2013-03-13 22:52:30
10个不同的对象:一个相同的
Dim obj(9) as MyObj
Dim objarr New Generic.List(Of MyObj) 'As Neolisk Suggested in Original Post
For x as Integer = 0 to 9
obj(x).SomeValue = x
objarr.add(obj(x))
Next
10个不同的实例对象:
'-------Your Code------
Dim obj as MyObj
Dim objarr as New Arraylist
For x as Integer = 1 to 10
obj = New MyObj
obj.SomeValue = x
objarr.add(obj)
Next
你的例子都不正确。试试看。第一个从不实例化对象。第二个创建10个不同的对象。 – 2013-03-13 22:30:43
是的,你的代码会正常工作。每次使用New
时,都会实例化(创建)一个新对象。因此,每次通过循环时,obj
变量将被重新分配以引用新的对象。
虽然有几件事情可以改善你的代码。首先,您应该使用List(Of MyObj)
而不是ArrayList
。其次,它会少些混乱,如果你只是声明循环的obj
变量中,例如:
Dim objects As New List(Of MyObj)()
For x As Integer = 1 To 10
Dim obj As New MyObj()
obj.SomeValue = x
objects.Add(obj)
Next
每次都不会重新调暗对象,导致需要更多时间? – wayofthefuture 2013-03-13 22:54:30
不可以。不管怎样,编译器可能会将代码优化为相同的IL代码。即使不这样做,速度差异也是微不足道的,因此完全可以忽略不计。在大多数情况下,最好关注编写设计良好,易于阅读的代码。不要担心性能问题,直到它们成为问题。如果你真的担心你代码的每一行代码的性能,那么你将不会用.NET编程,你会在程序集中进行编程。 – 2013-03-14 00:42:46
不仅在性能问题上关注自己是浪费时间,还会导致难以阅读和难以维护代码。在这种情况下,遵循的最佳实践规则是应该在尽可能最窄的范围内声明变量。 – 2013-03-14 00:43:45
作为一个侧面说明,你可能要考虑使用Generic.List(中MyObj中)''而不是,为一个强大的类型列表。 – Neolisk 2013-03-13 20:04:54