У меня есть 3 способа получить ubound массива - PullRequest
3 голосов
/ 18 мая 2011

У меня есть 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 ]

4 голосов
/ 18 мая 2011

Я предполагаю, что вам нужно использовать индекс внутри цикла - в противном случае, просто используйте вместо этого цикл 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 с меньшей вероятностью знает.

1 голос
/ 18 мая 2011

Я предпочитаю третий, потому что это наиболее ясно, что вы измеряете - вы получаете верхнюю границу первого индекса массива «разделы». Другие описывают то же самое, но я не думаю, что они делают это так ясно.

1 голос
/ 18 мая 2011

Это в основном зависит от семантики того, что вы делаете.Выберите тот, который наиболее четко выражает то, что вы делаете в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...