为什么使用构造函数用于.NET数值数据类型?

时间:2014-07-05 13:30:04

标签: arrays vb.net collections integer

我现在学习数组和集合,作者使用以下声明

    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"。有人可以向我解释为什么我们在这里使用构造函数吗?

2 个答案:

答案 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()