以下のコードサンプルでは、変数currOn
がループの外側に持ち上げられ、一度しかインスタンス化されないようです。たとえば、itemList
に3つのアイテムがあり、2回目の繰り返しでSomeFunctionThatDoesSomeStuff
がtrue
を返すとします。 currOn
の値はtrue
になります。 3回目の反復では、与えられたVB.NETがブロックスコープ言語で、currOn
は再インスタンス化され、デフォルトはfalse
になると思っていました。しかし、それはtrue
のままであり、従ってsOn
の値に関係なく、それ以上の反復で更新されないことがわかります。それはcurrOn
の宣言がループの外側にプルアップされるjavascriptの関数スコープのようです。誰がここで何が起こっているのか知っていますか?さらなる例としてVB.NETのループ関数のスコープとブロックのスコープ
For Each item As MyItem In itemList
Dim currOn As Boolean
Dim sOn As Boolean = SomeFunctionThatDoesStuff(item)
currOn = currOn OrElse sOn
Debug.Print(String.Format("the value of currOn is: {0}", currOn))
Next
、明示的currOn = false
すべての反復を設定すると、私は上記の仕事に期待した通りに動作するようです。
For Each item As MyItem In itemList
Dim currOn As Boolean = False
Dim sOn As Boolean = SomeFunctionThatDoesStuff()
currOn = currOn OrElse sOn
Debug.Print(String.Format("the value of currOn is: {0}", currOn))
Next
非常に興味深い、あなたはループの外にコードを取り、ちょうどそれを手動で繰り返される場合は、同じスコープ内の変数の宣言を複製するため、コンパイルエラーになるだろうので、 - ただ一つの行があるという事実は、コンパイラが一度それを読んで、プロセスが複製されるという事実にかかわらず、それを「合法」コードとしてフラグを立てることを意味しなければならない。 –
これも私を驚かせる。おそらくこれはVB6コードのポートをより良くするためです。 – GSerg
興味深い...たぶんVB.NETのオプションとは何か? 2つのコードサンプルはまったく同じではないことに注意してください - 2つ目のコードサンプルは内部ループを持っています。最初の例の各ループの始めに 'currOn'を" False "に初期化すると、動作を知りたいのです。 – Tim