Wann IList und wann List zu verwenden ist
Ich weiß, dass IList ist die Schnittstelle und die Liste ist der konkrete Typ, aber ich weiß noch nicht, Wann jedes. Was ich jetzt mache ist, wenn ich nicht brauchen, die Art oder-FindAll-Methoden, die ich verwenden die Schnittstelle. Bin ich im Recht? Gibt es eine bessere Möglichkeit, zu entscheiden, wenn die Schnittstelle oder den konkreten Typ?
Kommentar zu dem Problem
Wenn jemand noch Fragen, ich finde, die besten Antworten hier: stackoverflow.com/questions/400135/listt-or-ilistt
InformationsquelleAutor der Frage Rismo | 2008-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Regeln, die ich Folgen:
Also beim schreiben einer Funktion oder Methode, die eine Sammlung haben, schreiben Sie ihn nicht auf eine Liste, sondern eine IList<T>, ICollection<T> oder IEnumerable<T>. Die generischen Schnittstellen wird immer noch funktionieren, auch für heterogene Listen, weil System.Objekt kann sein ein T zu. Dadurch sparen Sie Kopfschmerzen, wenn Sie sich entscheiden, ein Stack oder eine andere Datenstruktur, die weiter unten an der Straße. Wenn alles, was Sie tun müssen, ist die Funktion foreach durch, die IEnumerable<T> ist wirklich alles, was Sie sollte Fragen.
Auf der anderen Seite, wenn die Rückkehr ein Objekt aus einer Funktion, die Sie wollen, um dem Benutzer die reichsten möglich, eine Reihe von Operationen, ohne Sie mit zu wirken um. So in diesem Fall, wenn es eine List<T> intern, bringen Sie eine Kopie als eine List<T>.
InformationsquelleAutor der Antwort Lee
Microsoft-Richtlinien als geprüft von FxCop vom Gebrauch von List<T> in öffentlichen APIs - lieber IList<T>.
Übrigens habe ich jetzt fast immer erklären, dass ein-dimensionale arrays als IList<T>, die kann ich konsequent die Nutzung der IList<T>.Count-Eigenschaft und nicht als Array.Länge. Zum Beispiel:
InformationsquelleAutor der Antwort Joe
Es ist eine wichtige Sache, dass die Leute immer scheinen zu übersehen:
Können Sie ein einfaches array übergeben werden, um etwas, das akzeptiert ein
IList<T>
parameter, und dann können Sie anrufenIList.Add()
und erhalten eine Laufzeit-exception:Unhandled Exception: System.NotSupportedException: Collection was of a fixed size.
Betrachten Sie beispielsweise den folgenden code:
Wenn Sie rufen Sie wie folgt vor, erhalten Sie eine Laufzeit-exception:
Dies geschieht, weil mit einfachen arrays mit
IList<T>
verstößt gegen das Liskov-substitution-Prinzip.Aus diesem Grund, wenn Sie anrufen
IList<T>.Add()
möchten Sie vielleicht zu prüfen, die eineList<T>
statt einerIList<T>
.InformationsquelleAutor der Antwort Matthew Watson
Stimme ich mit Lee ' s Rat für die Aufnahme von Parametern, aber nicht zurück.
Wenn Sie geben Sie Ihre Methoden, um eine Schnittstelle, dass heißt, Sie sind frei zu verändern, die genaue Umsetzung wird später ohne die zeitraubende Methode je zu wissen. Ich dachte, ich würde nie ändern müssen, aus einer Liste<T> musste aber später ändern, um eine benutzerdefinierte Liste-Bibliothek für die zusätzliche Funktionalität zur Verfügung gestellt. Da würd ich nur wieder eine IList<T> keiner von den Menschen, die die Bibliothek hatte zu ändern code.
Natürlich, die müssen nur anwenden, um Methoden, die von außen sichtbar (also public-Methoden). Ich persönlich benutze Schnittstellen auch in internen code, aber wie sind Sie in der Lage alles zu verändern, was den code selbst, wenn Sie wichtige änderungen es ist nicht unbedingt notwendig.
InformationsquelleAutor der Antwort ICR
IEnumerable
Sie sollten versuchen, und verwenden Sie die am wenigsten spezifische Art, die für Ihren Zweck. IEnumerable ist weniger spezifisch als IList
Verwenden Sie IEnumerable-wenn Sie möchten, eine Schleife durch die Elemente in einer Sammlung
IList
IList implementiert IEnumerable
Sollten Sie IList verwenden, wenn Sie Zugriff benötigen, die durch den index Ihrer Sammlung hinzufügen und löschen von Elementen, etc..
Liste
Liste implementiert IList
InformationsquelleAutor der Antwort rajesh
Es ist immer am besten, um die niedrigsten base-Typ möglich. Dies gibt dem Implementierer der Schnittstelle, oder Verbraucher von Ihrer Methode, die Gelegenheit zu nutzen, was Sie wie hinter den kulissen.
Für die Sammlungen sollten Sie versuchen zu verwenden, IEnumerable wo es möglich ist. Dies bietet die höchste Flexibilität, ist aber nicht immer geeignet.
InformationsquelleAutor der Antwort tgmdbm
Wenn Sie innerhalb einer einzigen Methode (oder auch in einer einzelnen Klasse oder einer Baugruppe in einigen Fällen) und niemand draußen gehen, um zu sehen, was Sie tun, verwenden Sie die fülle einer Liste. Aber wenn Sie die Interaktion mit externen code, wie wenn Sie der Rückgabe einer Liste von einer Methode, dann ist Sie nur wollen, zu erklären, dass die Schnittstelle ohne unbedingt binden sich an eine spezifische Implementierung, vor allem, wenn Sie keine Kontrolle darüber haben, wer kompiliert gegen Ihr code danach. Wenn Sie begann mit einem konkreten Typ, und Sie beschlossen, zu einem anderen, auch wenn es verwendet die gleiche Schnittstelle, die Sie gehen zu brechen jemand anderes den code, es sei denn, Sie starteten mit einer Schnittstelle oder abstrakte Basis-Typ.
InformationsquelleAutor der Antwort Mark Cidade
Ich glaube nicht, dass es hart und schnell Regeln für diese Art der Sache, aber normalerweise gehe ich durch die Richtlinie der Verwendung der leichtesten möglichen Weg, bis Sie absolut notwendig ist.
Zum Beispiel, sagen wir, Sie haben eine
Person
Klasse und einGroup
Klasse. EinGroup
Instanz hat viele Menschen, so eine Liste würde hier Sinn machen. Wenn ich erkläre der Liste Objekt inGroup
werde ich einIList<Person>
und instanziieren Sie es alsList
.Und, wenn Sie nicht sogar brauchen, alles in
IList
Sie können immerIEnumerable
zu. Mit modernen Compilern und Prozessoren, ich glaube nicht, dass es wirklich einen Geschwindigkeits-Unterschied, so ist dies mehr nur eine Frage des Stils.InformationsquelleAutor der Antwort swilliams
Sie sind meist besser über die allgemein verwendbaren Typ, in diesem Fall, die die IList-oder noch besser die IEnumerable-Schnittstelle, so dass Sie können schalten Sie die Umsetzung bequem zu einem späteren Zeitpunkt.
Jedoch, in .NET 2.0, es ist eine ärgerliche Sache - IList nicht ein Sort() Methode. Sie können mit einem mitgelieferten adapter statt:
InformationsquelleAutor der Antwort petr k.
AList-Objekt können Sie eine Liste erstellen, die Dinge hinzufügen, entfernen, aktualisieren, index in es und etc. Liste wird verwendet, wenn Sie wollen einfach nur eine generische Liste, in der Sie angeben, Objekttyp, und das ist es.
IList auf der anderen Seite ist eine Schnittstelle. Grundsätzlich, wenn Sie wollen, erstellen Sie Ihre eigene Art von Liste, sagen wir eine Liste der Klasse aufgerufen, BookList, dann können Sie die Schnittstelle, um Ihnen grundlegende Methoden und Struktur für die neue Klasse. IList ist für, wenn Sie wollen, erstellen Sie Ihre eigenen, speziellen sub-Klasse, die Liste.
Weiterer Unterschied ist:
IList ist ein Interface und kann nicht instanziert werden. Die Liste ist Klasse und instanziiert werden können. Es bedeutet:
InformationsquelleAutor der Antwort Javid
In Situationen, die ich in der Regel kommen über,, die ich nur selten verwenden, IList direkt.
In der Regel ich benutze es als argument an eine Methode
Diese wird mir erlauben, zu tun, generische Verarbeitung auf fast jedem array in der .NET framework, es sei denn, es verwendet, IEnumerable und nicht IList, das passiert manchmal.
Es kommt wirklich auf die Art von Funktionalität, die Sie benötigen. Ich würde empfehlen die Verwendung der List-Klasse in den meisten Fällen. IList ist am besten, wenn Sie brauchen, um eine benutzerdefinierte array, das hätte einige sehr spezifische Regeln, die Sie möchten, um Kapseln in einer Sammlung, so Sie nicht selbst wiederholen, wollen aber trotzdem .NET zu erkennen, es als eine Liste.
InformationsquelleAutor der Antwort Dan Herbert
Solltest du mit dem interface nur, wenn Sie es brauchen, z.B. wenn Sie Ihre Liste, angeheuert, um ein IList-Implementierung andere als Liste. Dies ist wahr, wenn Sie zum Beispiel verwenden, NHibernate, die wirft ILists in eine NHibernate-Tasche-Objekt beim abrufen von Daten.
Wenn Liste ist die einzige Implementierung, die Sie jemals verwenden Sie für eine bestimmte Sammlung, fühlen Sie sich frei, es zu erklären, wie eine konkrete Liste Umsetzung.
InformationsquelleAutor der Antwort Jon Limjap