Problem mit Delegaten in C #

7

Im folgenden Programm druckt DummyMethod immer 5. Wenn wir jedoch den kommentierten Code verwenden, erhalten wir unterschiedliche Werte (d. h. 1, 2, 3, 4). Kann jemand bitte erklären, warum das passiert?

%Vor%

Auch wenn der folgende Code verwendet wird, bekomme ich das gewünschte Ergebnis.

%Vor%     
malay 02.11.2009, 10:30
quelle

4 Antworten

17

Das Problem ist, dass Sie die gleiche Variable i in jedem Delegaten erfassen - was am Ende der Schleife nur den Wert 5 hat.

Stattdessen möchten Sie, dass jeder Delegat eine andere Variable erfasst, was bedeutet, dass eine neue Variable in der Schleife deklariert wird:

%Vor%

Dies ist ein ziemlich gewöhnliches "Gotcha" - Sie können ein bisschen mehr über erfasste Variablen und Schließungen in my closures article .

    
Jon Skeet 02.11.2009, 10:40
quelle
4

Dieser Artikel wird Ihnen wahrscheinlich helfen zu verstehen, was passiert (dh was für eine Schließung ist): Ссылка

    
Dan Byström 02.11.2009 10:40
quelle
4

Wenn Sie sich den generierten Code ansehen (mit Reflector), können Sie den Unterschied sehen:

%Vor%

Wenn Sie den ursprünglichen Code verwenden, erstellt er eine temporäre Klasse im Hintergrund, diese Klasse enthält einen Verweis auf die Variable "i", so dass Sie nach Jons Antwort nur den endgültigen Wert sehen.

%Vor%

Ich empfehle wirklich, den Code in Reflektor anzuschauen, um zu sehen, was dort vorgeht, wie ich es verstanden habe erfasste Variablen. Stellen Sie sicher, dass Sie die Optimierung des Codes auf ".NET 1.0" im Optionsmenü eingestellt haben, sonst werden alle Hinterseiten-Szenen ausgeblendet.

    
Matt Warren 02.11.2009 10:59
quelle
2

Ich denke, das liegt daran, dass die Variable i auf den Heap gesetzt wird (es ist eine erfasste Variable )

Sehen Sie sich diese Antwort an .

    
Stefan Steinegger 02.11.2009 10:45
quelle

Tags und Links