vb.net - 创建数组时什么时候需要使用 `New` 关键字?

标签 vb.net

我只是在看 help VB 中数组的页面,显然所有这些都是创建数组的可接受语法:

Dim numbers(4) As Integer 

inquiriesByYearMonthDay = New Byte(20)()() {}

Dim sales()() As Double = New Double(11)() {}

请注意,第一个甚至没有 New 关键字,第二个只有 New 关键字,第三个同时使用 DimNew 关键字。为什么会有如此多的不一致,您应该使用哪一个?我对第一个最好奇,因为甚至从未创建数组对象

最佳答案

实际上,只创建了第一个数组并可以使用。其他的只是声明为数组(或部分创建)。

Dim numbers(4) As Integer
Dim sales()() As Double = New Double(11)() {}

如 Intellisense 所示,numbers 已准备好使用。对于锯齿状数组 sales - 一个数组数组 - 到目前为止,代码只是告诉它它将包含多少个数组。每一个都是 Nothing 因为代码没有创建或分配一个给任何槽:

enter image description here

声明 sales 的行实际上做了两件可能令人困惑的事情。它可以这样声明:

' at some point I will want an array of array of doubles named sales:
Dim sales()() As Double

' Ok, I need it to hold 12 double arrays:
sales =  New Double(11)() {}

第一步声明变量和类型。第 2 步通过创建临时数组并分配它来定义“容器数组”。 (该链接试图用 inquiriesByYearMonthDay 来说明这一点 - 它在前面的 block 中声明。)

Sales 还没有准备好使用,它只是一堆Nothing

' Ok, I need the first array to hold 5 elements
sales(0) = New Double(4) {}       ' 0 based, so 4 == 5 items
sales(0)(0) = 12.67               ' FINALLY we can use it

现在,sales(0)(0 thru 4) 可以存储数据。 sales(1)() 其余的还没有初始化。

New 并没有直接作用于sales。它正在创建一个新的临时数组(在右侧),该数组立即分配给左侧 sales() 中的一个槽。

关键是:数组在给定大小后就可以使用了。因此,它们在功能上是相同的:

' create int array with 5 slots:
Dim numbers(4) As Integer
' declare array; assign empty 4 slot int array to it:
Dim numbers() As Int32 = New Int32(4) {}

第一个声明包括尺寸;第二个为它分配一个指定大小的(新)临时数组。也就是说,VB 可以推断大小:

Dim fishes As String() = {"cod", "salmon", "tuna", "perch", "barracuda"}

{...} 是另一个临时数组,VB 将其分配给“fishes”。


但是数组很笨重。 sales(6,3) 代表什么?为了使它们可读,您需要到处都有常量:foo = sales(SALES_MARCH, SALES_ZIGGY)。就个人而言,我认为唯一好的数组是具有已知固定值的静态数组:

Dim Days As String() = {"sun", "mon", "tues"....}

否则,List(Of T)Dictionary(TK, TV)Collection(Of T) 和许多其他方法更容易使用、创建、管理和合作(他们自己调整!)

关于vb.net - 创建数组时什么时候需要使用 `New` 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35003606/

相关文章:

javascript - 通过 asp.net 在 javascript 中打开多个弹出窗口

.net - 调用中继器内的按钮或下拉列表

mysql - DataReader 已打开,必须先将其关闭

vb.net - VB中可以继承带参数的sub new(构造函数)吗?

vb.net - 在运行时创建 DSN 条目?

c# - 是否需要处理本地画笔变量?

windows - 有关使用 Intel UPNP 虚拟目录处理程序的任何示例/教程吗?

.net - 取消数据绑定(bind)控件验证事件不会抑制更新数据源的尝试

vb.net - Environment.GetFolderPath(Environment.SpecialFolder.Personal) 出现意外目录

vb.net - 以编程方式将 RDLC 报告另存为 PDF