das Codebeispiel unten gegeben, so scheint es, dass die Variable currOn
außerhalb der Schleife erhöht und nur einmal instanziiert. Zum Beispiel, sagen, es gibt drei Elemente in itemList
und auf der zweiten Iteration SomeFunctionThatDoesSomeStuff
kehrt true
. Der Wert currOn
ist dann true
. Auf der dritten Iteration, hätte ich gedacht, dass angesichts VB.NET ein Sprachblock Rahmen ist, dass currOn
würde false
erneut instanziiert und Standard werden; aber ich sehe, dass es bleibt true
und daher unabhängig von dem Wert von sOn
, nicht in weiteren Iterationen aktualisiert. Es scheint wie der Funktionsumfang von javascript, wo die Deklaration von currOn
außerhalb der Schleife hochgezogen werden würde. Wer weiß, was hier vor sich geht?VB.NET For-Schleife Funktionsumfang vs Block Umfang
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
Als ein weiteres Beispiel, das Setzen explizit currOn = false
jede Iteration scheint zu funktionieren, wie ich die oben arbeitet erwartet hätte.
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
Sehr interessant, denn wenn man aus einer Schleife den Code genommen und wiederholt es nur manuell, Sie würden aufgrund doppelte Deklaration einer Variablen im gleichen Umfang einen Compiler-Fehler erhalten - die Tatsache, dass die nur eine Zeile muss ist, bedeutet der Compiler liest es nur einmal und Flaggen es als ‚legal‘ Code, und zwar unabhängig von der Tatsache, das der Prozess dupliziert werden. –
Das überrascht mich auch. Wahrscheinlich ist dies, um VB6-Code-Ports besser zu machen. – GSerg
Interessant ... vielleicht etwas mit VB.NET-Optionen zu tun? Beachten Sie, dass die zwei Codebeispiele nicht genau übereinstimmen - der zweite hat eine innere Schleife. Ich wäre neugierig, das Verhalten zu sehen, wenn Sie am Anfang jeder Schleife im ersten Beispiel 'currOn' auf" False "initialisieren. – Tim