2008-08-05 13 views

答えて

45

理由:VB6でも

Option Base 1 

を、あなたはこのような特定の配列の下限を変更することができますFor Eachを使用しないでください。そうすれば、LBoundUBoundが何であるか気にする必要はありません。私はいつも、それぞれのために使用してきました

Dim x, y, z 
x = Array(1, 2, 3) 

For Each y In x 
    z = DoSomethingWith(y) 
Next 
+7

あなたの例の 'y'は配列のセルのコピーであり、参照ではないので、' For Each'を使って直接配列のセルを編集することはできません。配列の編集のために、 'for i = LBound(arr)To UBound(arr)'は 'arr(i)'を使って直接セルを参照し、 'arr(i)= Trim(arr(i) )) ')。 –

1

おそらくVB6から来ています。 VB6でOption Base文で、あなたは下のこのような配列の下限を変更することができますので:

Dim myArray(4 To 42) As String 
1

...

16

に良い理由がFor i = LBound(arr) To UBound(arr)

dim arr(10) 10 0〜(と仮定して、配列の11のメンバーを割り当てを使用しないでありますVB6デフォルトオプションベース)。

多くのVB6プログラマは、配列が1から始まり、割り当てられたarr(0)を使用しないと想定しています。 For i = 1 To UBound(arr)またはFor i = 0 To UBound(arr)を使用すると、arr(0)が使用されているかどうかがわかるため、バグの潜在的な原因を取り除くことができます。

For eachは、ポインタではなく各配列要素のコピーを作成します。

これには2つの問題があります。

  1. 値を配列要素に代入しようとすると、元の配列に値が反映されません。このコードは、変数iに値47を割り当てますが、要素arrには影響しません。

    arr = Array(3,4,8) 
    for each i in arr 
        i = 47 
    next i 
    Response.Write arr(0) '- returns 3, not 47

  2. 我々はfor eachに配列要素のインデックスを知らない、と私たちは要素の順序を保証するものではありません(順序であるように見えますが。)

3

LBoundは必ずしも0になるとは限りません。

VBScriptでは0の下限以外の配列を作成することはできませんが、COMコンポーネントからバリアントの配列を取得することは可能です異なるLBoundを指定した可能性があります。

それは、私はそれのようなことをやったことはないと言った。

関連する問題