2012-06-11 19 views
6

Wenn ich eine Funktion habe, die eine Sammlung eines bestimmten Typs übernimmt, welchen Parametertyp sollte ich verwenden?
Ich habe bisher angenommen, IEnumerable ist die Standardeinstellung, aber ich würde gerne wissen, ob das korrekt ist und wenn ja, warum.
ICollection scheint auch wie ein gültiger Kandidat (aufgrund seines Namens), aber ich habe den Eindruck IEnumerables sind benutzerfreundlicher.
Ich dachte, dass die Beispiele, die das Framework uns gibt, eine gute Idee wären, aber ich finde, dass etwas wie String.Join, nach einem Array von Strings fragt.Funktionsparameter: IEnumerable, ICollection oder Array?

+1

Diese haben vor hier beantwortet: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return Beste Grüße. – Oscar

+3

['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) hatte eine Überladung im .NET 4 Zeitrahmen hinzugefügt, so dass es ein' IEnumerable' dauert. Die Überladung, die das Array annimmt, stammt von den vorgenerischen Tagen ... –

+7

@Oscar: das ist über den Rückgabetyp - ich spreche Parameter. –

Antwort

10

Sie nehmen die, die am wenigsten Clients auferlegt, aber Sie können Ihre Arbeit erledigen. Wenn Sie mit IEnumerable<T> über ICollection<T> durchkommen können, sollten Sie es verwenden, da dies den Clients Ihrer API größere Flexibilität bietet.

3

IEnumerable sind mehr bevorzugt als ICollections. Here ist die großzügige Antwort auf Ihre Frage.

1

Schnittstellen sind meist als Parameter oder Rückgabetypen in Funktionen verwendet, um die I in SOLID Design-Prinzipien (Interface Segregation Principle) für die Herstellung von Guss zu erleichtern, zu unterstützen vorbei mehrere konkrete Typen an die Schnittstelle Parameter und Ausblenden (Verkapselung) die tatsächliche Unterstützung Parametertyp von den Clients Ihrer öffentlichen Funktionen.

  • über IEnumerable:

Sehr einfach, setzt es den Enumerator, der eine einfache Iteration über eine nicht-generische Sammlung unterstützt.

[ComVisibleAttribute(true)]  
public interface IEnumerable 
  • hier über ICollection:

Die ICollection-Schnittstelle IEnumerable erstreckt; IDictionary und IList sind spezialisiertere Schnittstellen, die ICollection erweitern. Eine IDictionary-Implementierung ist eine Sammlung von Schlüssel/Wert-Paaren, wie die Hashtable-Klasse. Eine IList-Implementierung ist eine Sammlung von Werten, auf deren Member wie die ArrayList-Klasse per Index zugegriffen werden kann. Einige Auflistungen, die den Zugriff auf ihre Elemente beschränken, z. B. die Queue-Klasse und die Stack-Klasse, implementieren die ICollection-Schnittstelle direkt. Wenn weder die IDictionary-Schnittstelle noch die IList-Schnittstelle die Anforderungen der erforderlichen Sammlung erfüllen, leiten Sie stattdessen die neue Auflistungsklasse für mehr Flexibilität von der ICollection-Schnittstelle ab.

[ComVisibleAttribute(true)] 
public interface ICollection : IEnumerable 
  • Hier ist über IList Schnittstelle:

    [ComVisibleAttribute (true)] öffentliche Schnittstelle IList: ICollection, IEnumerable

Mehr von MSDN über IList: IList ist ein Abkömmling der ICollection Schnittstelle und ist die Basisschnittstelle aller nicht-generischen li st. IList-Implementierungen lassen sich in drei Kategorien einteilen: schreibgeschützt, feste Größe und variable Größe. Eine schreibgeschützte IList kann nicht geändert werden.Eine IList mit fester Größe erlaubt nicht das Hinzufügen oder Entfernen von Elementen, sondern ermöglicht die Änderung vorhandener Elemente. Ein IList mit variabler Größe ermöglicht das Hinzufügen, Entfernen und Ändern von Elementen.

Tipp:

Falls Sie nur foreach für Ihre Sammlung Parameter zu unterstützen, sollte IEnumerable genug sein. Wenn Sie auch die Unterstützung für das Hinzufügen und Entfernen von Elementen aus der Sammlung möchten, ist die IList die bessere Wahl.

Vorschläge: Dieser Blog-Eintrag: IEnumerable, ICollection, IList Compared sollten Sie sicherlich helfen, besser und präzise Entscheidung zu treffen.

Weitere Informationen zu Leistung und anderen Vergleichen von IList und IEnumerable finden Sie unter this article.

+2

-1: Ich könnte nicht mehr widersprechen. ** Always ** (für einen gegebenen Wert von always) verwende die minimale Abstraktion, die den Job erledigt, so dass dein Client-Code (der Code, den du schreibst) nicht darauf beschränkt ist, denselben Container zu verwenden, du bist die Funktion wird generischer und hat ein größeres Potenzial für die Wiederverwendung. –

+0

Nun @BinaryWorrier Ich habe die Antwort aktualisiert, um IList zu verwenden, um eine Option nur zu sein, wenn die Unterstützung zum Hinzufügen oder Entfernen von Elementen erforderlich ist und IEnumerable zu verwenden, wenn nur foreach Unterstützung erforderlich ist .. Ich hoffe, dass Sie die Antwort jetzt besser verstanden .. – VS1

+0

Entschuldigung aber ich stimme immer noch nicht zu. 'IEnumerable ' sollte bevorzugt werden, da es die minimale Abstraktion ist. z.B. Stellen wir uns vor, Sie haben eine Funktion, die eine Liste von Zahlen nimmt und Min, Max und Durchschnitt erhält. Wenn die Funktion eine ICollection verwendet, kann sie von jeder Klasse verwendet werden, die die I-Sammlung implementiert. Wenn es für IEnumerable geschrieben ist, kann es auf _anything_ funktionieren, da Sie problemlos einen Adapter für DataReader oder Dateilesegeräte schreiben, die 'return'-Elemente ohne zusätzlichen Speicher- oder Verarbeitungsaufwand erzeugen und trotzdem die gleiche Funktion verwenden. –

Verwandte Themen