是否可以使用List(Of T)
的复合声明,其中指定了列表的大小,并使用默认值为T类型的对象填充列表?
例如,当T为Integer
时,我们可以为短列表执行以下操作:
Public MyList As New List(Of Integer)(New Integer() {1, 2, 3})
但如果我尝试以下更长的非平凡对象,请列出:
Public MyList As New List(Of MyClass)(New MyClass(100) {})
似乎列表中没有填充MyClass
的实例,并且尝试写入项目会导致异常:
“对象引用未设置为对象的实例”
为什么一个人工作而另一个工作呢?
(我知道我可以使用Add()
方法单独添加对象,但是必须有一种更简洁的方法来设置一个指定大小的默认值空对象的数组[这实际上就是我想要的],对吧?)
编辑:在我的用例中,MyClass只是一个简单的数据(目前)类
Public Class MyClass
Public Value As Byte
Public Shadow As Byte
End Class
也许使用结构可能更容易FWIW?
答案 0 :(得分:1)
是否可以使用List(Of T)的复合声明,其中指定了列表的大小,并使用默认值为T类型的对象填充列表?
是。但是(至少在4.5.2框架和VS2013的VB.Net 1 版本中),初始化程序的数量需要与设置的容量相匹配:
Sub Main()
Dim x = New List(Of Integer)(100) {1, 2, 3, 4}
Console.WriteLine(x(0))
End Sub
给出:
数组初始值设定项缺少97个元素。
然而:
Public MyList As New List(Of MyClass)(New MyClass(100) {})
似乎列表中没有填充MyClass实例,并且尝试写入项目会导致异常:
您需要创建对象。 MyList
的创建将包含100个元素,但它们都是Nothing
(null
)。您需要创建对象以使用MyClass
的成员:
MyList(0) = new MyClass();
MyList(0).Value = 42
也许使用结构可能更容易FWIW?
基于这个问题:不,不会因为自然语法(例如上面对Value
成员的分配)不会给你预期的结果。结构被复制,因此使用结构语句只会更改结构实例的副本而不是集合中的实例。
1 我没有跟踪VB.Net的版本号。