VB中的ArrayList声明,带或不带New关键字

时间:2014-05-28 18:53:07

标签: vb.net

使用以下Visual Basic类:

Public Class Student
  Public Property StudentName As String
  Public Property Scores As Integer()
End Class

以下示例代码行由我阅读的教科书提供:

arrList.Add(New Student With {.StudentName = "name", .Scores = New Integer() {98, 92, 81, 60}})

但这行代码没有' New Integer()'声明似乎工作正常:

arrList.Add(New Student With {.StudentName = "name", .Scores = {98, 92, 81, 60}})

我不明白为什么我需要使用' New Integer()'宣言。是否有其他事情发生在' New Integer()'在这种情况下声明,还是不必要的代码?

2 个答案:

答案 0 :(得分:2)

来自http://msdn.microsoft.com/en-us/library/wak0wfyt.aspx#BKMK_Populating

  

使用数组文字创建数组时,可以提供数组类型或使用类型推断来确定数组类型。以下代码显示了这两个选项。

Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

答案 1 :(得分:0)

整数是基本类型(内存地址中的数据字节),您不需要将其声明为New。当您输入Dim x As Integer = 0时。 ; p数组也是一种类型:一堆指向内存地址的指针。

使用New运算符创建Object的实例,使用其CTOR。需要将对象初始化为工作状态。对于原始类型,不调用New只会导致对象被设置为Nothing,就像类一样 - 引用类型。但是,由于已经分配了内存,因此可以简单地将基元的值赋值给它。但是,对于类,由于无法知道所有对象指针和类型的大小,因此不会分配内存。

如果在基本类型上使用New运算符,将创建该类型的新实例,使用空值初始化,即:0或"",而不是{ {1}}。这是通过Class而不是Type来完成的。

例如,这里是String Class,还有String Data Type,这是一个字符数组。 (实际上,在dotnet中,字符串甚至不是数组,它们只是连续的字节序列,尽管int中的某些类型的隐式转换使用数组方法)。

另外,我应该提一下,使用Nothing运算符在堆上创建对象,同时在堆栈上只创建一个指针。不在方法中使用带有基元的New运算符将导致它被分配到堆栈。

编辑:啊,但为了解决您的特定用例,最好使用New,因为您在函数外部使用它(将其添加为某个对象的成员) ),无论如何都要对堆进行复制操作。如果您要立即使用它们,则只在方法中使用原语,否则,将它们放在堆栈中会适得其反。