我现在学习数组和集合,作者使用以下声明
Dim locIntegerArray() As Integer
locIntegerArray = New Integer() {1I, 2I, 3I, 4I}
我从未在Integer面前看过构造函数。我会这样宣布:
Dim locIntegerArray() As Integer = {1I, 2I, 3I, 4I}
实际上我会说这是多余的但是
Dim locIntegerArray() As Integer
locIntegerArray = Integer() {1I, 2I, 3I, 4I}
给我"Integer is a type and cannot be used as an expression"
。有人可以向我解释为什么我们在这里使用构造函数吗?
答案 0 :(得分:3)
我从未在Integer面前看过构造函数
这不是构造函数,而是New
关键字。它用于调用类型的构造函数。当然,这也适用于值类型(包括Integer
)。
但你在这里看到的却是别的东西:它不是New Integer
,而是New Integer()
- 一个重要的区别。您正在调用数组构造函数,而不是Integer
构造函数。
不幸的是,这里的VB语法混乱,因为括号也用于调用构造函数 - 所以你通常通过说New T()
来调用类型的构造函数你是对的(虽然VB也允许省略括号,导致甚至更多混淆)。但是,后续数组初始化程序{ … }
消除了此表达式的歧义,并使其成为数组构造函数调用,而不是对Integer
构造函数的调用。即:
Dim a = New Integer() ' a = 0
Dim b = New Integer ' same
Dim c = New Integer() { } ' c = array of integers (length 0)
Dim d = New List(Of Integer)() ' d = list of integers (length 0)
Dim e = New List(Of Integer) ' same
你的第二个代码也有效,因为较新版本的VB.NET引入了New Integer() { … }
语法的简写符号。效果是一样的。现在,没有理由再使用旧的,明确的语法,因为它完全是多余的。
您可以使用Option Infer On
:
Dim x = { 1, 2, 3 }
这是最简洁的形式。 MSDN列出了在VB中初始化数组的所有可能的语法形式。
答案 1 :(得分:1)
如果您对为什么需要使用像Integer
这样的数值数据类型的构造函数感到困惑,那么您不应该这样做。认识到 Integer
的不是构造函数, 表达式 {{1}数组} 而不是。
与C#不同,这在VB中有点令人困惑。在C#中很明显,因为整数数组将用方括号表示,如:
Integer
......相当于VB:
var a = new int[]{1,2,3};
从上面的比较中,您可以清楚地看到Dim a = New Integer(){1,2,3}
等同于表示整数数组的Integer()
。