【问题标题】:Arrays in Visual BasicVisual Basic 中的数组
【发布时间】:2016-07-29 15:11:05
【问题描述】:

在 VB 中声明一个数组时,您是否会将零元素留空并调整代码以使其对用户更友好?

这是针对 Visual Basic 2008 的

【问题讨论】:

  • 仅当您讨厌团队中的所有其他开发人员时。
  • @Gabe 所以,你是在告诉我,在 VB(哪一个?)中,当你向编译器询问一个有 12 个插槽的数组时,它会给你一个有 13 个插槽的数组?
  • @Will:不,我是说在DIM 语句中,您指定的是数组的边界,而不是元素的数量。 DIM x(12)DIM x(0 to 12)相同,表示最低元素索引为0,最高索引为12,一共13个元素。而且我很确定所有版本的 VB 都是这样运行的,尽管有些版本可能默认为 1 作为下限。
  • @gabe 我嘴里吐了一点。
  • @Will:这是出于向后兼容的原因。 VB 6 曾经允许您指定所需的任何下限。如果你愿意,你可以说Dim x(5 to 11),然后得到一个包含 7 个元素的数组。也许是非标准的,但肯定更方便、更灵活。 VB.NET 保留了相同的语法,同时将数组限制为固定的零下限。 C# 中的语法“更好”并没有什么特别的原因,只是它与 C 和 C++ 一致(显然是设计使然)。

标签: vb.net arrays


【解决方案1】:

不,我不会这样做。似乎可能有助于可维护性,但这是一种非常短视的观点。

这样想。每个必须理解和维护代码的程序员只需要很短的时间就可以适应零索引数组。但是,如果您使用基于 1 的数组,这与几乎所有其他 VB.NET 代码以及几乎所有其他常见编程语言中的数组不同,那么团队中的每个人都会花费更长的时间。他们会不断地犯错,因为他们的自然假设在这种特殊情况中并不准确而犯错。

我知道那是什么感觉。当我在 VB 6 中工作时,我喜欢基于 1 的数组。对于我存储的数据类型来说,它们非常自然,而且我到处都在使用它们。在这里可以完美记录,因为您有明确的语法来指定数组的上限 和下限。在 VB.NET(它是 Visual Basic 语言的较新但不兼容版本)中并非如此,所有数组都必须从零开始索引。在最初的几天里,我很难切换到 VB.NET 的从零开始的数组。在最初的调整期之后,老实说,我再也没有回头。

有些人可能会争辩说,将每个数组的第一个元素留空会不必要地消耗额外的内存。虽然这显然是正确的,但我认为这是我上面介绍的原因背后的次要原因。优秀的开发人员编写代码供他人阅读,因此我赞扬您考虑如何使您的代码合乎逻辑且易于理解。问这个问题,你走在正确的道路上。但从长远来看,我认为这个决定不是一个好的决定。

非常特殊的情况中可能会有少数例外情况,具体取决于您存储在数组中的数据类型。但同样,未能全面做到这一点似乎会损害总体上的可读性,而不是帮助它。一旦你了解了数组是如何被索引的,那么简单地编写以下内容并不是特别违反直觉:

For i As Integer = 0 To (myArray.Length - 1)
    'Do work
Next

请记住,在 VB.NET 中,您还可以使用 For Each 语句来遍历您的数组元素,这对于许多人来说更具可读性。例如:

 For Each i As Integer In myArray
     'Do work
 Next

【讨论】:

    【解决方案2】:

    首先,它是关于程序员友好的,而不是用户友好的。用户永远不会知道代码是从 0 开始还是从 1 开始。

    其次,从0开始是默认的,会越来越多的使用。

    第三,从 0 开始对计算机来说更自然。从元素上看,它有两种状态,0 和 1,而不是 1 和 2。

    我已经将几个 VB6 项目升级到 vb.net。一开始修改为从0开始的数组,总比以后调试代码要好。

    【讨论】:

    • 假设“用户”是指下一个必须维护代码的程序员,这似乎是合理的。毕竟,这确实是程序源代码的“用户”。正如我的回答中所指出的,这是一个重要的问题,值得赞扬提问者注意。此外,从零开始的数组对计算机来说“更自然”并没有什么特别的原因。我不明白数组索引与二进制标志的状态有什么关系。如果你有一个包含 3 个元素的数组怎么办?我也不同意应该编写代码来增加计算机的舒适度。
    • 好吧,为什么对电脑来说“更自然”呢?如果您的计算机只有 4 位(或 64 位,相同),那么您可以有最小值 0000 和最大值 1111,即从 0 到 15,而不是 1 到 16。是的,它没有必须是 Array 对“用户”,程序员的方式。但是如果程序员知道Array其实有一个地址(指针),并且是Array的第一个元素的地址,而下一个(第二个)在(地址+1)处,那么我们就知道这个数组是本质上是基于 0 的。
    【解决方案3】:
    • 我的大多数 VB.Net 数组都是从 0 开始的,并且使用了每个元素。这在 VB.Net 和代码 mustn't surprise the reader 中很常见。可读性至关重要。
    • 有什么例外吗?也许如果我有一个从 VB6 移植的程序,所以它使用基于 0 的数组和未使用的初始元素,并且它需要一个 small 更改,我可能会匹配现有代码的模式。 Least surprise again.
    • 100 次中有 99 次不应该出现问题,因为您应该使用 List(Of T) 而不是数组!

    【讨论】:

    • 同意使用泛型集合而不是数组的建议。
    【解决方案4】:

    要查看数组索引的“用户”是谁?任何优秀的开发人员都可以处理零索引数组,而真正的用户不应该看到它们。如果用户必须与数组进行交互,则为此创建一个真正用户友好的系统(文本或基于 1 的虚拟索引或任何需要的)。

    【讨论】:

      【解决方案5】:

      如果您发现使用基于 0 的数组不方便,则可以在 Visual Basic 中声明从 1 开始的数组。

      Dim array(1 to 10) as Integer
      

      这只是口味问题。我在 Visual Basic 中使用基于 1 的数组,但在 C 中使用基于 0 的数组;)

      【讨论】:

      • 请注意,这在 VB 6 中是可能的。在编写此答案时,问题对于正在使用的 VB 版本含糊不清。但鉴于最近的澄清,此代码在 VB.NET 中将不起作用。所有数组都必须是零索引的。
      • 在 Microsoft Visual Basic 6.0 中,您可以定义下限和上限设置为任何整数的数组。在 Microsoft Visual Basic .NET 中,每个数组维度的下限为零 (0)。您不能为具有任何其他整数的数组声明下限。此外,Visual Basic .NET 不支持 Option Base 语句。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多