我有这 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/