【问题标题】:ArrayList declaration in VB with or without New keywordVB 中的 ArrayList 声明,带或不带 New 关键字
【发布时间】:2014-05-28 18:53:07
【问题描述】:

使用以下 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()' 声明是否发生了其他事情,或者是不必要的代码?

【问题讨论】:

  • 你用的是什么版本的VB.net?
  • 如果您使用的是VS2008,则需要使用教科书中的示例。
  • 使用 VB 2013,但文字是 VB 2008,所以 VS2008 评论非常有助于理解为什么我可以省略“新”。

标签: vb.net


【解决方案1】:

来自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}

【讨论】:

  • 这种情况也出现在 dotnet 中的大多数其他数据类型中。这称为缩小/扩大转换。实际上,更多的是隐式转换。与输入Dim s As Strings = 15 相同。隐式转换为字符串。
  • 很好的链接来解释不使用“新”时如何应用扩展。
【解决方案2】:

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

您使用New 运算符创建对象的实例,使用它的CTOR。需要将对象初始化为工作状态。对于原始类型,不调用New 只会导致对象被设置为Nothing,就像类一样——引用类型。但是,可以简单地分配原语的值,因为内存已经分配。然而,对于一个类来说,内存没有被分配,因为不可能知道所有对象指针和类型的大小。

如果您在原始类型上使用New 运算符,则会创建该类型的新实例,并使用空值初始化,即:0 或“”,而不是Nothing。这是通过类完成的,而不是类型。

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

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

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

【讨论】:

  • 这些 cmets 和上面的回答清楚地解释了为什么我应该使用“新”,即使我可以“摆脱它”。
  • 对于大多数意图和目的,您应该在堆上分配大部分类型/对象。除了即:For x = 1 To 3。 New,因为这是暗示的。一个对象没有堆栈;一种方法(包括 CTOR)。在堆上创建东西有开销和几个函数指针调用。
  • 优秀的教程提醒堆/堆栈之间的差异,以及更好的何时/为什么应该考虑新的。谢谢。
猜你喜欢
  • 2017-06-25
  • 2013-09-24
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2023-03-06
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多