【问题标题】:I've got 3 ways to get the ubound of an array我有 3 种方法来获取数组的 ubound
【发布时间】:2011-05-18 05:58:29
【问题描述】:

我有这 3 段代码:

 For x = 0 To sections.Length - 1
        'work
    Next
    For x = 0 To UBound(sections)
        'work
    Next
    For x = 0 To sections.GetUpperBound(0)
        'work
    Next

我已经思考了大约 10 分钟,但我仍然无法确定一种选择相对于另一种选择的优势究竟是什么。

我想知道是否有人真的对此有所考虑并愿意分享他们的见解。基本上我想知道哪个“更好”(你可以引用清晰、易于重构、性能、可维护性、良好标准,任何使它“更好”的东西)

【问题讨论】:

    标签: .net vb.net algorithm loops foreach


    【解决方案1】:

    我假设您需要在循环中使用索引 - 否则,只需使用 For Each 循环。

    在我看来,

    1 是一维数组的惯用方式。这是最接近您在 C# 中看到的正常方式:

    for (int x = 0; x < array.Length; x++)
    

    不幸的是,无论是从零还是从一,VB 现在都有这种轻微的双重性格。 .NET 通常是一个从零开始的平台,在这里你会为此受苦;围绕从零开始的 API 设计的语言设计可能会使“包容性下限;独占上限”模式更简单 - 而 VB 在两端都是包容性的,这就是您需要“-1”的原因”。

    2 看起来像是 VB 特有的函数;我会尽量避免这些,除非它们具有显着优势,因为它会使非 VB 程序员(例如 C# 程序员)更难理解代码。在许多情况下,这只是一个很小的问题,但当它没有真正的优势时,我会坚持使用“常规”.NET 方法。

    3 真的是为多维(矩形)数组而设计的——那里的 0 表示你想要 first 维度。当您处理一维数组时,它会无缘无故地增加额外的复杂性。

    可能第一种方法也是最高效的 - JIT 识别这种模式并能够在循环中删除一些数组边界测试(它知道 x 在边界内的数组)。现在UBound 可能 编译为具有相同属性的 IL - 我不确定。我怀疑它调用了 Microsoft.VisualBasic 程序集中的一个方法,而 JIT 不太可能知道该方法。

    【讨论】:

    • #2 Ubound 确实是 VB 特有的函数,包含在 VB.Net 中是为了与早期版本的 Basic(如 VB6)兼容。 Thereareotherquestions讨论wh
    • 取消字符限制! ...其他讨论是否应避免这些 VB 特定功能的问题
    【解决方案2】:

    这基本上取决于你在做什么的语义。选择最清楚地表达你在代码中所做的事情。

    【讨论】:

      【解决方案3】:

      我更喜欢第三个,因为它最清楚您要测量的内容 - 您将获得数组“sections”的第一个索引的上限。其他人也描述了同样的事情,但我认为他们没有说得那么清楚。

      【讨论】:

      • 在一维数组的常见情况下,显式指定维度对我来说毫无理由地感觉像是额外的复杂性。我很少使用多维数组,所以我认为处理这些应该是例外而不是规则。
      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      相关资源
      最近更新 更多