对象数组,数组类和需要一个完整的数组声明

  • 本文关键字:数组 一个 声明 对象 vb.net
  • 更新时间 :
  • 英文 :


请注意,似乎我问了很多问题,但它们都是相关的。只是由于缺乏对基本概念的理解,我无法提出一个清晰的问题,因此我试图给出一些场景来突出我的困惑。

Dim myArray As Array
myArray = New Integer() {1, 2, 3, 4}

Dim mynewArray() As Integer = New Integer() {4, 5, 6, 7}

有没有人能帮我理解一下以下几点?

  1. 我的理解是,' myArray '不是一个数组。相反,它是数组类的一个字段,可以指向我们创建的任何数组?这是正确的理解吗?
  2. 如果是这样的话,为什么要写Dim myArray() As Integer = New Integer() {4, 5, 6, 7}这样的东西。这样申报有什么好处吗?这一点变得更加相关,因为以下所有声明都可以工作:

•昏暗mynewArray () = New Integer(){4、5、6、7}

•Dim mynewArray = New Integer() {4,5,6,7}

•因此,即使我们省略了"As Integer"部分,甚至省略了圆括号"()",声明似乎也有效。所以谁能告诉我这里发生了什么,以及完整定义的优点是什么:Dim mynewArray() As Integer = New Integer() {4,5,6,7}

  1. "mynewArray"的作用到底是什么?我认为是字段它用于存储对正在创建的数组的引用?我的理解对吗?

另外,一个相关的问题是' myArray '这是数组类型和对象数组之间的区别是什么?我的困惑源于以下几点:

  1. myArray可以指向任何数组(与它所包含的元素类型无关)
  2. 一个对象数组,像' myObjArray '在Dim myObjArray() As Object = {26, 27, 28, 29, 30}可以接受任何类型的元素

所以这些(即myArraymyObjArray)不是本质上做同样的事情,这给了我们充分的灵活性,关于元素的类型,他们所指向的数组可以保存?

在评论中,该问题指出了一些额外的上下文,即这是由VB文档中关于迭代的一篇文章提示的。具体地说,本文使用枚举中值的迭代作为示例。System.Enum.GetValues可以追溯到。net 1.0(泛型之前),并返回一个在运行时类型为的数组,作为返回值的枚举类型。因为a)它在泛型之前,b)该类型是在运行时而不是编译时提供的,所以System.Enum.GetValues返回一个Array

这是将某些东西声明为Array是有意义的特定用例。你不太可能在更现代的代码中看到这样的东西——如果我现在写一个等价的System.Enum.GetValues,我会这样写:

Public Function GetValues(Of TEnum As Structure)() As IEnumerable(Of TEnum)

或:

Public Function GetValues(Of TEnum As Structure)() As TEnum()

但是在。net 1.0中这两个选项都不可用,因为泛型还不存在。

数组的工作方式有点像泛型,但是正如我前面提到的,在这种情况下,您只能在运行时获得包含的类型。

注意System.Array支持IEnumerable,所以如果你先使用Cast(Of T)转换为指定类型的序列,你可以使用Linq函数。

您很少需要为变量使用Array类型。千万别这么做。如果需要数组,则使用特定类型。对于字段,显式声明类型,例如

Private myArray1 As Integer()
Private myArray2 As Integer() = {1, 2, 3}

对于一个局部类型,让类型在初始化时被推断出来,例如

Dim myArray1 As Integer()
Dim myArray2 = {1, 2, 3}

在初始化局部变量时指定类型的唯一原因是如果你想要元素以外的类型,例如

Dim myArray As Object() = {1, 2, 3}

这真的是所有你需要知道的。其他任何事情都是不必要的复杂化。

请注意,在每种情况下,myArray等都是变量。它们的行为就像任何其他引用类型变量一样,即默认情况下它们是Nothing,它们可以引用适当类型的对象。数组是类实例所以数组变量像任何其他类类型的变量。同样,不要试图把事情复杂化。如果你知道Form,DataTable,String等类型的变量是如何工作的,那么你就知道数组变量是如何工作的。

最新更新