.net - 我有 3 种方法来获取数组的 ubound

标签 .net vb.net algorithm loops foreach

我有这 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 分钟,但我仍然无法确定一种选择相对于另一种选择的优势到底是什么。

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

最佳答案

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

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

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

不幸的是,如今 VB 在基于零还是基于一方面具有这种轻微的双重人格。 .NET 通常是一个零基础的平台,你在这里受苦;围绕从零开始的 API设计的语言可能会使“包含下限;独占上限”模式更简单——而 VB 在两端都包含,这就是为什么你需要“-1 ".

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

3 实际上是为多维(矩形)数组设计的 - 0 表示您想要第一个 维度。当您处理一维数组时,它会无缘无故地增加额外的复杂性。

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

关于.net - 我有 3 种方法来获取数组的 ubound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6040465/

相关文章:

.net - 使用 MVVM 轻量级工具包动态创建 ViewModel

.NET/Entity Framework Core/SQL Server 过程返回重复值

vb.net - 关闭后表单保留值

VB.NET bool 值没有在循环中获取其默认值吗?

algorithm - 文本处理的形式化方法

algorithm - 使用 OCAML 进行函数式编程

c# - 如何实现自己的锁定机制

.net - 使用与声明上下文变量相比有优势吗?

c++ - 数据结构实现代码理解

c# - 如何禁用 c# 消息框蜂鸣声?