Anonyme Methode für den Ereignishandler in der for-Schleife

7

Kann das in einer for-Schleife gemacht werden?

%Vor%

Das funktioniert nicht, weil ich außerhalb der Grenzen (5)

bin %Vor%     
dirtyw0lf 24.08.2013, 23:17
quelle

2 Antworten

10

Dies kommt von dem Lambda-Ausdruck; i wird geteilt alle von ihnen . Zu dem Zeitpunkt, zu dem die Funktion ausgeführt wird, werden sie im Wesentlichen wie timers[i].Tick += (sender, e) => Tick(targs[5]) aufgerufen.

Um dies zu vermeiden, erstellen Sie eine lokal begrenzte Variable ( int locali = i ) und verwenden Sie diese stattdessen in Ihrer Zeile. Dadurch wird sichergestellt, dass jeder Lambda-Ausdruck tatsächlich den erwarteten Wert erhält.

%Vor%

i wird 5 aus der letzten Iteration Ihrer Schleife vor dem Beenden. Natürlich haben Sie kein targs[5] -Element, also wirft es ein IndexOutOfRangeException .

Technisch gesehen müssen Sie locali nicht für den timers[i].Tick -Teil verwenden, da es sofort ausgewertet wird, aber ich persönlich finde es verwirrend, die beiden zu mischen.

Einige zusätzliche Lektüre zum Thema:

Die foreach-Kennung und die Sperrungen

Schließen über die Schleifenvariable als schädlich angesehen

    
Chris Sinclair 24.08.2013, 23:21
quelle
8

In diesem Fall gibt es nur ein i und alle Lambdas erfassen den gleichen Wert. Verwenden Sie ein lokales Element, das auf die Schleife beschränkt ist, so dass jedes Lambda eine andere Kopie hat

%Vor%     
JaredPar 24.08.2013 23:21
quelle

Tags und Links