Wenn die IEnumerator.Reset () -Methode aufgerufen wird?

8

Lassen Sie uns diesen Code haben:

%Vor%

Und in der Hauptmethode:

%Vor%

Warum funktioniert die zweite förach nicht? und das "i" initialisiert nicht wieder ??

Stimmt das? Die Reset-Methode sollte automatisch aufgerufen werden, bevor foreach ausgeführt wird.

warum es hier nicht anruft ??

    
Farah_online 16.10.2010, 05:27
quelle

5 Antworten

6

IEnumerable und IEnumerator sollten in der Regel separate Klassen sein. Mit Ausnahme von Enumeratoren, die immer leer oder immer das gleiche Element zurückgeben, muss die GetEnumerator-Methode immer eine neue Instanz eines IEnumerator zurückgeben.

Es gibt nicht viel Sinn für IEnumerator.Reset; for-each-Schleifen verwenden sie nicht, und Benutzer eines IEnumerable / IEnumerator können sie nur verwenden, wenn sie wissen, was der aufzählbare Typ ist. In diesem Fall könnten sie den tatsächlichen Typ anstelle der Schnittstelle verwenden.

    
supercat 16.10.2010, 06:06
quelle
9

Reset ist redundant; so sehr, dass es eine Anforderung in der Sprachspezifikation für Iteratorblöcke ist, eine Ausnahme auf Reset auszulösen. Das Richtige ist, einfach den alten Iterator zu entfernen und loszulassen und GetEnumerator erneut aufzurufen. Oder besser: vermeiden mit , um es zweimal zu lesen, da nicht alle Daten wiederholbar sind.

    
Marc Gravell 16.10.2010 10:10
quelle
3

Reset wird nicht von foreach aufgerufen. Ein Blick auf die Hauptmethode in Reflector bestätigt dies.

Die .NET-Klassen, wie ArrayList , geben tatsächlich eine neue Instanz einer Klasse zurück, die IEnumerator implementiert.

Zum Beispiel ArrayList implementiert IEnumerable und seine GetEnumerator Methode sieht folgendermaßen aus:

%Vor%

Sie müssen sich also keine Gedanken über den Aufruf von Reset machen, da jede foreach eine neue Instanz des Enumerators verwendet.

Ein vollständiges Beispiel mit der Implementierung von IEnumerable und einer separaten Klasse, die IEnumerator implementiert, finden Sie in der Dokumentation zu IEnumerable .

    
Jeff Ogata 16.10.2010 05:59
quelle
2

Das funktioniert auch:

%Vor%     
Mikolaj 22.12.2011 13:26
quelle
-1

Dort gibt es viele Instanzen, in denen ich das tun muss, also rufe ich in meiner GetEnumerator-Methode reset auf. Hier ist ein Beispiel:

%Vor%     
user2880159 14.10.2013 19:28
quelle

Tags und Links