.net I';我们有3种方法来获得数组的ubound

.net I';我们有3种方法来获得数组的ubound,.net,vb.net,algorithm,loops,foreach,.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分钟,但我仍然无法确定一种选择相对于另一种选择的优势到底是什么 我想知道是否有人真的考虑过这一点,并愿

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


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

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

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

我假设您需要在循环中使用索引-否则,只需为每个循环使用一个

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

for(int x=0;x
不幸的是,如今VB有着这种轻微的双重性格,无论是基于零还是基于一。NET通常是一个以零为基础的平台,你在这里为此而痛苦;围绕基于零的API设计的语言可能会使“包含下限;独占上限”模式更简单,而VB在两端都是包含的,这就是为什么需要“-1”

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

3实际上是为多维(矩形)阵列设计的-那里的0表示您想要第一维。在处理一维数组时,它会毫无理由地增加额外的复杂性


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

在一维数组的常见情况下,显式指定维度对我来说是额外的复杂性,我没有理由这么认为。我很少使用多维数组,因此我认为处理这些数组应该是例外,而不是规则。#2确实是一个特定于VB的函数,包含在VB.Net中,以便与早期版本的Basic(如VB6)兼容。其中讨论了什么是字符限制。。。讨论是否应避免使用这些特定于VB的函数的其他问题
for (int x = 0; x < array.Length; x++)