Warum werden nicht alle diese Variablen auf die gleiche Weise behandelt?

9

Ich habe überprüft, dass die Position der Variablendeklarationen in VB.NET keine Rolle spielt, außer für den Bereich (für diese Frage ) und ich dachte, ich überprüfe besser, was passiert, wenn sie in eine Schließung "gehoben" werden. Ich habe die Spezifikation nicht gelesen, aber ich kann diese Ergebnisse nicht erklären:

%Vor%

Die obigen Ausgaben:

%Vor%

inner4 wird jedes Mal zurückgesetzt, wenn es sinnvoll ist, genauso wie alle oder keine der anderen innerX , aber warum nur inner2 ?!

    
Mark Hurd 07.11.2012, 09:29
quelle

2 Antworten

2

Von MSDN (Hervorhebung von mir):

  

[...] was der Compiler im Grunde tut, wenn er in einen neuen Bereich mit einer angehobenen Variablen eintritt, prüft der Compiler, ob bereits eine Instanz der Schließung existiert; Wenn dies der Fall ist, erstellt der Compiler eine neue Instanz der Schließung und setzt den Wert der Variablen aus der vorherigen Schließung zurück.

     

Beachten Sie, dass der Compiler nur die obige Überprüfung durchführt , wenn er eine Schleife oder ein GoTo in der Funktion erkennt, in der die Schließung generiert wird .

Link

    
J... 07.11.2012 11:49
quelle
2

(Dies ist mehr ein Kommentar, aber benötigt zu viel Code, um es als eins zu halten.)

Reflector zeigt was passiert:

%Vor%

(Dies basiert auf meinem Code, der ein Try außerhalb des For enthält.)

Sie können hier die For -Schleife sehen (gesehen als Do -Schleife mit der $VB$Local_i vorher gesetzt) ​​und die innere Do erzeugen Schließungen, bei denen die vorherige Instanz der Schließung übergeben wurde, aber die Try bekommt diese Behandlung nicht.

Weiß immer noch nicht warum ? Sieht für mich wie ein Käfer aus. Wenn ich an einem Tag keine vernünftige "Entschuldigung" (:-)) bekomme, setze ich sie auf Connect. (Kann jemand bestätigen, dass .NET 4.5 VB11 das gleiche tut?)

    
Mark Hurd 07.11.2012 13:05
quelle

Tags und Links