使用以下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()'在这种情况下声明,还是不必要的代码?
答案 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
,因为您在函数外部使用它(将其添加为某个对象的成员) ),无论如何都要对堆进行复制操作。如果您要立即使用它们,则只在方法中使用原语,否则,将它们放在堆栈中会适得其反。