2009-08-17 1 views
1

Duplizieren vonWhat is the purpose/advantage of using yield return iterators in C#?Unterschied zwischen Iterator und Array in C#

Okay, es diese einfach nicht. Kannst du mir im Detail erklären, wie sich die beiden unterscheiden?

wie ein Array zurückkehrend (Lets sagen string) oder eine Ausbeute Rückkehr mit Iterator (auch string) tun

ich sie finden die gleiche sein. Bitte gehen Sie ins Detail.

+0

Dies ist ein Duplikat, es gibt einige ausgezeichnete Antworten hier http://stackoverflow.com/questions/1088442/what-is-the-purpose-advantage-of-using-yield-return-iterators-in- c –

+0

Nein, ist es nicht. Ich vergleiche mit Array. Aber egal :) –

Antwort

9

Ein Array ist ein Zeiger auf einen Datenblock mit wahlfreiem Zugriff und fester Größe. Der Aufrufer kann Werte aktualisieren, auf Werte in beliebiger Reihenfolge usw. zugreifen.

Ein Iterator ist ein Schlüssel zu einer Sequenz von Werten (die unendlich lang sein können). Der Aufrufer kann auf sie nur in der Reihenfolge zugreifen, die von der Quelle bereitgestellt wird, und kann sie nicht aktualisieren.

Es gibt mehr Overhead-Zugriff auf jeden Wert in einer Sequenz, aber es hat den Vorteil, nicht alle Daten auf einmal zu benötigen, kann also für mittlere bis lange Sequenzen effizienter sein.

+0

Sie beantworten meine Frage immer auf den Punkt. Vielen Dank! –

2

Wenn Sie einen Iterator zurückgeben, der die interne Datenstruktur nicht ändern kann, müssen Sie möglicherweise keine Kopie davon erstellen.

Auf der anderen Seite ist ein häufiger Fehler, etwas zurückzugeben, das Sie intern verwenden, und dies ermöglicht externen Code, Ihre internen Datenstrukturen zu ändern, was normalerweise ein großes Nein ist.

Betrachten wir zum Beispiel die folgende:

Int32[] values = otherObj.GetValues(); 
values[0] = 10; 

Wenn die GetValues ​​Methode einfach ein internes Array zurückgibt, daß zweite Linie wird nun der erste Wert des Arrays verändern.

1

Iteratoren können nicht geändert werden, aber Arrays können. Sie können auf bestimmte Elemente in einem Array mit der [index] -Notation verweisen, aber bei Iteratoren können Sie nur vom ersten Element in der Reihenfolge gehen.

+0

Also, wenn Sie eine DLL oder Klasse erstellen möchten, um etwas an ein Drittpartei-Programm (sie using unsere) zurückzugeben, sollten Sie Iterator verwenden? –

+0

Genau! Das oder eine Kopie des Arrays zurückgeben. – AgileJon

2

Ein Array ist ein Datenspeicher. Ein Iterator ist nur ein Iterator über einen anderen Datenspeicher oder eine Methode, die eine Sequenz erzeugt.

Wenn also eine Methode ein Array zurückgibt, können Sie es und seine Elemente ändern. Sie können dies nicht über einen Iterator tun. Außerdem ist ein Array von begrenzter Größe. Ein Iterator könnte unendlich sein.