我有3种方法可以获得数组的无限制

时间:2011-05-18 05:58:29

标签: .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分钟,但我还是无法确定1选择的优势究竟是什么。

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

3 个答案:

答案 0 :(得分:4)

我假设您需要在循环中使用索引 - 否则,只需使用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不太可能知道它。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我更喜欢第三个,因为你最清楚你正在测量的是什么 - 你得到了数组“sections”的第一个索引的上限。其他人描述了同样的事情,但我不认为他们这样做是清楚的。