Каков наилучший способ перебора массива в классическом Asp VBScript?
в коде ниже
For i = LBound(arr) To UBound(arr)
какой смысл спрашивать с помощью LBound
? Конечно, это всегда 0.
5 ответов
Почему бы не использовать For Each
? Таким образом, вам не нужно заботиться о том, что LBound
и UBound
есть.
Dim x, y, z
x = Array(1, 2, 3)
For Each y In x
z = DoSomethingWith(y)
Next
есть веская причина НЕ ИСПОЛЬЗОВАТЬ For i = LBound(arr) To UBound(arr)
dim arr(10)
выделяет одиннадцать членов массива от 0 до 10 (при условии, что база параметров VB6 по умолчанию).
многие программисты VB6 предполагают, что массив основан на одном, и никогда не используют выделенный arr(0)
. Мы можем удалить потенциальный источник ошибок, используя For i = 1 To UBound(arr)
или For i = 0 To UBound(arr)
, потому что тогда понятно, является ли arr(0)
используется.
For each
делает копию каждого элемента массива, вместо указки.
здесь есть две проблемы.
-
когда мы пытаемся присвоить значение элементу массива, он не отражает оригинал. Этот код присваивает переменной значение 47
i
, но не влияет на элементыarr
.arr = Array(3,4,8) for each i in arr i = 47 next i Response.Write arr(0) '- returns 3, not 47
мы не знаем индекс элемента массива в
for each
, и нам не гарантируется последовательность элементов (хотя, похоже, она находится в порядок.)
LBound
не всегда может быть 0.
хотя невозможно создать массив, который имеет что-либо, кроме нижней границы 0 в VBScript, по-прежнему можно получить массив вариантов из COM-компонента, который, возможно, указал другой LBound
.
это сказало, что я никогда не сталкивался с тем, кто сделал что-то подобное.
вероятно, это происходит от VB6. Потому что с Опция Base оператор в VB6 вы можете изменить нижнюю границу массивов следующим образом:
Option Base 1
также в VB6 вы можете изменить нижнюю границу определенного массива следующим образом:
Dim myArray(4 To 42) As String