___ answer4550191 ___
  

Was ist der Unterschied zwischen IEnumerator und IEnumerable?

Jasons Antwort ist gut, aber ich dachte, ich würde nur hinzufügen, wie ich darüber denke. Stellen Sie sich vor, Sie haben eine Sequenz:

%Vor%

Stellen Sie sich nun vor, Sie haben einen Pfeil, der auf eine Position dieser Sequenz zeigt:

%Vor%

Ein "Pfeil" ist ein Objekt, das zwei Dinge tun kann. Erstens kann es dir das geben, auf das es zeigt. Zweitens kann es sich bei der nächsten Sache zeigen.

IEnumerator ist ein Pfeil. Es hat eine Eigenschaft, Current, die dir das gibt, auf das es zeigt. Es hat eine Methode, MoveNext (), die sich bei der nächsten Sache zeigt.

Wie bekommen Sie überhaupt einen Pfeil? Du brauchst eine Pfeilfabrik. Sie fragen die Fabrik nach einem Pfeil und Sie erhalten einen Pfeil, der auf das erste Element in der Sequenz zeigt.

IEnumerable ist eine Pfeilfabrik. Es hat eine Methode, GetEnumerator, die Ihnen einen Pfeil zum ersten Element der Sequenz gibt.

Eine nette Eigenschaft dieses Schemas ist, dass Sie mehrere Pfeile haben können, die auf verschiedene Stellen in derselben Reihenfolge zeigen.

  

Welche Vorteile bietet die Implementierung der generischen Schnittstelle IEnumerable anstelle von IEnumerable?

Angenommen, die Folge besteht aus ganzen Zahlen. Wenn Sie %code% implementieren, dann sagen Sie

%Vor%

was das tatsächlich tut, ist, das int in der Sequenz in ein Objekt zu konvertieren, die Ganzzahl zu boxen und dann das Objekt sofort wieder auf integer zu setzen, was eine völlig unnötige Speicherzuweisung zu jeder einzelnen Operation hinzufügt. Wenn der Compiler weiß, dass die Sequenz aus ganzen Zahlen besteht, kann er die unnötige Boxoperation überspringen.

Angenommen, die Sequenz besteht aus Strings. Wenn Sie %code% implementieren, können Sie sagen:

%Vor%

Wenn nicht, dann müssen Sie

sagen %Vor%

was unnötig und fehleranfällig ist. Anstatt den Compiler über eine Umwandlung anzuweisen, dass der Typ eine Zeichenfolge ist, können Sie garantieren , dass der Typ eine Zeichenfolge ist, indem Sie das Typsystem verwenden.

    
___ qstntxt ___

Ich verwende den folgenden Code, um myClass foreach zu aktivieren. Aber ich bin ziemlich neu in der Programmierung und habe einige Schwierigkeiten, den folgenden Code zu verstehen. Ich habe meine Probleme in den Kommentaren beschrieben. Ich wäre dankbar für die Bereitstellung von Informationen.

%Vor%     
Frage zu IEnumerable und IEnumerator ___ answer4548580 ___
  

1) Was ist IEnumerator für?

IEnumerator ist der echte Arbeitsteil mit den MoveNext () - und Current-Mitgliedern.

  

Was ist der Unterschied zwischen IEnumerator und IEnumerable

?

IEnumerable ist die Schnittstelle für eine Sammlung, um zu signalisieren, dass sie über einen GetEnumerator () verfügt.

  

2) [nicht generischer GetEnumerator] Wozu dient es? Es ruft nur die obige Methode auf

Die nicht-generische Methode dient nur der Abwärtskompatibilität. Beachten Sie, dass es durch Verwendung der expliziten Implementierung so weit wie möglich außer Sichtweite verschoben wird. Implementieren Sie es, weil Sie müssen und dann vergessen.

  

3) Zu guter Letzt, welche Vorteile mir die Implementierung der genetischen Schnittstelle bringt     IEnumerable statt nur IEnumerable

Bei Verwendung mit %code% ist der Vorteil klein, da foreach die Looping-Variable eingibt. Sie können %code% in der foreach verwenden:

%Vor%

Aber mit %code% haben Sie auch eine typsichere Schnittstelle zu anderen Bereichen, insbesondere LINQ:

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ answer4548627 ___

Dies ist die Deklaration für %code% :

%Vor%

Sie haben keine andere Wahl, als Sie die nicht-generische IEnumerable-Schnittstelle zu implementieren. Sie erhalten einen Kompilierungsfehler, wenn Sie die IEnumerable.GetEnumerator () - Implementierung auslassen. Dies ist Gepäck, das von den .NET 1.x-Tagen übrig geblieben ist, an denen noch keine Generics verfügbar waren, und der Übergangsphase für .NET 2.0, bei der Interop mit .NET 1.x-Assemblys unterstützt werden musste. Wir sind dran.

    
___ tag123ienumerable ___ IEnumerable und sein generisches Gegenstück IEnumerable sind .NET-Schnittstellen zum Iterieren (oder Aufzählen) einer Sammlung von Elementen. ___ answer4548488 ___

%code% gibt es bereits seit der Einführung von Generika in die Sprache, um nicht bereits vorhandenen Code zu unterbrechen. Die Standardmethode ruft die generische Implementierung auf.

Bei einer generischen Aufzählung muss der Consumer Ihrer Klasse beim Iterieren nicht jedes Element in eine Zeichenfolge umwandeln.

    
___ answer4548579 ___
  

1) Wofür ist %code% ? Was ist der Unterschied zwischen %code% und %code% ?

%code% ist eine Schnittstelle, die Methoden darstellt, mit denen Sie eine Sequenz aufzählen können. Der Unterschied zwischen %code% und %code% besteht darin, dass ersteres den Vertrag für Objekte darstellt, mit denen Sie eine Sequenz aufzählen können, und letzteres den Vertrag für Objekte darstellt, die eine Sequenz sind, die überzählig sein kann.

%Vor%
  

2) Wozu dient es? Es ruft nur die obige Methode auf.

Ersteres repräsentiert eine Implementierung der Methode %code% auf dem Vertrag %code% . Letzteres stellt eine explizite Implementierung der Methode %code% auf dem Vertrag %code% dar. Das Problem ist, dass beide Verträge eine Methode namens %code% haben, aber unterschiedliche Rückgabetypen haben, so dass eine Methode nicht beide Verträge gleichzeitig erfüllen kann (jede Klasse, die %code% implementiert, muss auch %code% als %code% implementieren). Letzteres ruft die Implementierung von %code% auf, da dies eine sinnvolle Implementierung ist, die ein %code% als %code% zurückgibt.

  

3) Welche Vorteile habe ich von der Implementierung der generischen Schnittstelle %code% anstelle von %code% ?

Starkes Tippen. Sie wissen, dass die Elemente in einer Sequenz %code% alle Instanzen von %code% sind, während Sie für %code% nicht wissen und am Ende versuchen könnten, ein Element des Letzteren in eine Instanz von %code% zu verwandeln kann nicht sein.

    
___ answer4548505 ___

Zur dritten Frage (warum Generika verwenden?) hier sind einige Antworten:

Sollten wir Generic Collection verwenden, um die Sicherheit zu verbessern und Leistung?

Kurz gesagt, verwenden Sie so oft wie möglich generische Sammlungen.

    
___ tag123ienumerator ___ IEnumerator und sein generisches Gegenstück IEnumerator sind .NET-Schnittstellen, die die Iteration durch Elemente in einer Sammlung erleichtern. ___

7

Ich verwende den folgenden Code, um myClass foreach zu aktivieren. Aber ich bin ziemlich neu in der Programmierung und habe einige Schwierigkeiten, den folgenden Code zu verstehen. Ich habe meine Probleme in den Kommentaren beschrieben. Ich wäre dankbar für die Bereitstellung von Informationen.

%Vor%     
Frage zu IEnumerable und IEnumerator
Grant Smith 28.12.2010, 18:38
quelle

6 Antworten

11
  

Was ist der Unterschied zwischen IEnumerator und IEnumerable?

Jasons Antwort ist gut, aber ich dachte, ich würde nur hinzufügen, wie ich darüber denke. Stellen Sie sich vor, Sie haben eine Sequenz:

%Vor%

Stellen Sie sich nun vor, Sie haben einen Pfeil, der auf eine Position dieser Sequenz zeigt:

%Vor%

Ein "Pfeil" ist ein Objekt, das zwei Dinge tun kann. Erstens kann es dir das geben, auf das es zeigt. Zweitens kann es sich bei der nächsten Sache zeigen.

IEnumerator ist ein Pfeil. Es hat eine Eigenschaft, Current, die dir das gibt, auf das es zeigt. Es hat eine Methode, MoveNext (), die sich bei der nächsten Sache zeigt.

Wie bekommen Sie überhaupt einen Pfeil? Du brauchst eine Pfeilfabrik. Sie fragen die Fabrik nach einem Pfeil und Sie erhalten einen Pfeil, der auf das erste Element in der Sequenz zeigt.

IEnumerable ist eine Pfeilfabrik. Es hat eine Methode, GetEnumerator, die Ihnen einen Pfeil zum ersten Element der Sequenz gibt.

Eine nette Eigenschaft dieses Schemas ist, dass Sie mehrere Pfeile haben können, die auf verschiedene Stellen in derselben Reihenfolge zeigen.

  

Welche Vorteile bietet die Implementierung der generischen Schnittstelle IEnumerable anstelle von IEnumerable?

Angenommen, die Folge besteht aus ganzen Zahlen. Wenn Sie IEnumerable implementieren, dann sagen Sie

%Vor%

was das tatsächlich tut, ist, das int in der Sequenz in ein Objekt zu konvertieren, die Ganzzahl zu boxen und dann das Objekt sofort wieder auf integer zu setzen, was eine völlig unnötige Speicherzuweisung zu jeder einzelnen Operation hinzufügt. Wenn der Compiler weiß, dass die Sequenz aus ganzen Zahlen besteht, kann er die unnötige Boxoperation überspringen.

Angenommen, die Sequenz besteht aus Strings. Wenn Sie IEnumerable<string> implementieren, können Sie sagen:

%Vor%

Wenn nicht, dann müssen Sie

sagen %Vor%

was unnötig und fehleranfällig ist. Anstatt den Compiler über eine Umwandlung anzuweisen, dass der Typ eine Zeichenfolge ist, können Sie garantieren , dass der Typ eine Zeichenfolge ist, indem Sie das Typsystem verwenden.

    
Eric Lippert 28.12.2010, 22:57
quelle
6
  

1) Wofür ist IEnumerator ? Was ist der Unterschied zwischen IEnumerator und IEnumerable ?

IEnumerator ist eine Schnittstelle, die Methoden darstellt, mit denen Sie eine Sequenz aufzählen können. Der Unterschied zwischen IEnumerator und IEnumerable besteht darin, dass ersteres den Vertrag für Objekte darstellt, mit denen Sie eine Sequenz aufzählen können, und letzteres den Vertrag für Objekte darstellt, die eine Sequenz sind, die überzählig sein kann.

%Vor%
  

2) Wozu dient es? Es ruft nur die obige Methode auf.

Ersteres repräsentiert eine Implementierung der Methode GetEnumerator auf dem Vertrag IEnumerable<string> . Letzteres stellt eine explizite Implementierung der Methode GetEnumerator auf dem Vertrag IEnumerable dar. Das Problem ist, dass beide Verträge eine Methode namens GetEnumerator haben, aber unterschiedliche Rückgabetypen haben, so dass eine Methode nicht beide Verträge gleichzeitig erfüllen kann (jede Klasse, die IEnumerable<T> implementiert, muss auch IEnumerable als IEnumerable<T> : IEnumerable implementieren). Letzteres ruft die Implementierung von IEnumerable<string>.GetEnumerator auf, da dies eine sinnvolle Implementierung ist, die ein IEnumerator als IEnumerator<string> : IEnumerator zurückgibt.

  

3) Welche Vorteile habe ich von der Implementierung der generischen Schnittstelle IEnumerable<string> anstelle von IEnumerable ?

Starkes Tippen. Sie wissen, dass die Elemente in einer Sequenz IEnumerable<string> alle Instanzen von String sind, während Sie für IEnumerable nicht wissen und am Ende versuchen könnten, ein Element des Letzteren in eine Instanz von String zu verwandeln kann nicht sein.

    
jason 28.12.2010 18:54
quelle
3

Dies ist die Deklaration für IEnumerable<T> :

%Vor%

Sie haben keine andere Wahl, als Sie die nicht-generische IEnumerable-Schnittstelle zu implementieren. Sie erhalten einen Kompilierungsfehler, wenn Sie die IEnumerable.GetEnumerator () - Implementierung auslassen. Dies ist Gepäck, das von den .NET 1.x-Tagen übrig geblieben ist, an denen noch keine Generics verfügbar waren, und der Übergangsphase für .NET 2.0, bei der Interop mit .NET 1.x-Assemblys unterstützt werden musste. Wir sind dran.

    
Hans Passant 28.12.2010 19:00
quelle
3
  

1) Was ist IEnumerator für?

IEnumerator ist der echte Arbeitsteil mit den MoveNext () - und Current-Mitgliedern.

  

Was ist der Unterschied zwischen IEnumerator und IEnumerable

?

IEnumerable ist die Schnittstelle für eine Sammlung, um zu signalisieren, dass sie über einen GetEnumerator () verfügt.

  

2) [nicht generischer GetEnumerator] Wozu dient es? Es ruft nur die obige Methode auf

Die nicht-generische Methode dient nur der Abwärtskompatibilität. Beachten Sie, dass es durch Verwendung der expliziten Implementierung so weit wie möglich außer Sichtweite verschoben wird. Implementieren Sie es, weil Sie müssen und dann vergessen.

  

3) Zu guter Letzt, welche Vorteile mir die Implementierung der genetischen Schnittstelle bringt     IEnumerable statt nur IEnumerable

Bei Verwendung mit foreach ist der Vorteil klein, da foreach die Looping-Variable eingibt. Sie können var in der foreach verwenden:

%Vor%

Aber mit IEnumerable<string> haben Sie auch eine typsichere Schnittstelle zu anderen Bereichen, insbesondere LINQ:

%Vor%     
Henk Holterman 28.12.2010 18:54
quelle
0

GetEnumerator gibt es bereits seit der Einführung von Generika in die Sprache, um nicht bereits vorhandenen Code zu unterbrechen. Die Standardmethode ruft die generische Implementierung auf.

Bei einer generischen Aufzählung muss der Consumer Ihrer Klasse beim Iterieren nicht jedes Element in eine Zeichenfolge umwandeln.

    
Mark Avenius 28.12.2010 18:41
quelle
0

Zur dritten Frage (warum Generika verwenden?) hier sind einige Antworten:

Sollten wir Generic Collection verwenden, um die Sicherheit zu verbessern und Leistung?

Kurz gesagt, verwenden Sie so oft wie möglich generische Sammlungen.

    
Ilya Kogan 28.12.2010 18:44
quelle

Tags und Links