2015-09-16 5 views
6

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 
+1

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. –

+0

Das überrascht mich auch. Wahrscheinlich ist dies, um VB6-Code-Ports besser zu machen. – GSerg

+0

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

Antwort

5

Wenn eine Variable innerhalb einer For Schleife deklarieren Sie es innerhalb eines Blocks Umfang deklarieren. Die Objekte, die innerhalb eines Blocks deklariert wurden, sind nur innerhalb dieses Blocks zugänglich, haben jedoch eine Lebensdauer über den gesamten Vorgang.

Von MSDN:

Auch wenn der Umfang einer Variablen auf einen Block beschränkt ist, ist seine Lebensdauer noch die des gesamten Verfahrens. Wenn Sie den Block während der Prozedur mehrmals eingeben, behält jede Blockvariable ihren vorherigen Wert bei. Um in diesem Fall unerwartete Ergebnisse zu vermeiden, sollten Blockvariablen am Anfang des Blocks initialisiert werden.

MSDN-Link: https://msdn.microsoft.com/en-us/library/1t0wsc67.aspx