2013-03-13 80 views
2

我知道这可能是一个愚蠢的问题,但它是一个非常大的交易,所以我想确保我做得很好。这个可以吗?在阵列中正确存储对象

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对象添加到列表中来犯错误? 谢谢

+5

作为一个侧面说明,你可能要考虑使用Generic.List(中MyObj中)''而不是,为一个强大的类型列表。 – Neolisk 2013-03-13 20:04:54

回答

2

您通常在循环之外声明收集列表。我对此采取:

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 
+0

非常好的代码。很显然,你在我之前就已经很开心了。 Of关键字引发我一个循环。我想用它更好,所以你将来不需要使用DirectCast来获取对象?为什么使用“财产”,当我可以做公共x为整数? – wayofthefuture 2013-03-13 22:58:05

+0

@scuzzlebuzzle:泛型也为您提供捕获大多数编译时错误的好处,这完全是因为没有运行时转换。 .NET框架似乎比字段对属性有更好的支持。 IIRC,它们的默认数据绑定不能映射到字段上,所以你需要使用属性。在你的情况下,要么工作得很好。 – Neolisk 2013-03-13 23:40:05

+1

如果您将其设为公共字段(例如'Public SomeValue As Integer'),则无法控制其吸气和吸气装置。所以,如果你需要这样做,你将不得不将它从一个领域改变成一个属性。当你这样做时,它会改变该类的公共接口(因为IL中的字段和属性处理方式非常不同)。因此,任何其他使用该类的程序集都需要重新编译,否则应用程序将会中断。因此,通常建议将所有属性预先设置好,以防万一。 – 2013-03-14 00:48:21

1

您只重用MyObj变量 - 将其视为容器。每次调用此行

obj = New MyObj

您正在创建MyObj中的新instance;因此,您的ArrayList将包含MyObj的10个不同实例。

+0

谢谢大卫 – wayofthefuture 2013-03-13 22:52:30

0

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 
+0

你的例子都不正确。试试看。第一个从不实例化对象。第二个创建10个不同的对象。 – 2013-03-13 22:30:43

1

是的,你的代码会正常工作。每次使用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 
+0

每次都不会重新调暗对象,导致需要更多时间? – wayofthefuture 2013-03-13 22:54:30

+0

不可以。不管怎样,编译器可能会将代码优化为相同的IL代码。即使不这样做,速度差异也是微不足道的,因此完全可以忽略不计。在大多数情况下,最好关注编写设计良好,易于阅读的代码。不要担心性能问题,直到它们成为问题。如果你真的担心你代码的每一行代码的性能,那么你将不会用.NET编程,你会在程序集中进行编程。 – 2013-03-14 00:42:46

+0

不仅在性能问题上关注自己是浪费时间,还会导致难以阅读和难以维护代码。在这种情况下,遵循的最佳实践规则是应该在尽可能最窄的范围内声明变量。 – 2013-03-14 00:43:45