564 Stimmen

Liste<T> oder IList<T>

Kann jemand mir erklären, warum ich IList über Liste in C# verwenden möchten?

Verwandte Frage: Warum wird es als schlecht angesehen, etwas zu enthüllen List<T>

2 Stimmen

Internet-Suche nach "Code zu einer Schnittstelle nicht eine Implementierung" und Sie können den ganzen Tag lesen..und finden Sie ein paar h0ly Kriege.

11 Stimmen

Diese Frage ist nicht meinungsbasiert. List<T> , IList<T> y T[] sind jeweils für verschiedene Szenarien besser geeignet, und der Unterschied ist im Allgemeinen ziemlich objektiv. Es ist wie diese andere Frage . Die andere Frage weist viele Gemeinsamkeiten auf, ist aber wohl kein echtes Duplikat. In beiden Fällen handelt es sich jedoch nicht um eine Meinungsäußerung. Möglicherweise hat der Prüfer nur auf den Titel der Frage geschaut, ohne die Frage selbst zu lesen. Der Körper ist objektiv.

30voto

Patrik Hägne Punkte 15961

Ich würde die Frage ein wenig umdrehen: Anstatt zu begründen, warum Sie die Schnittstelle gegenüber der konkreten Implementierung verwenden sollten, versuchen Sie zu begründen, warum Sie die konkrete Implementierung und nicht die Schnittstelle verwenden sollten. Wenn Sie es nicht begründen können, verwenden Sie die Schnittstelle.

1 Stimmen

Eine sehr interessante Denkweise. Und eine gute Art, beim Programmieren zu denken - danke.

0 Stimmen

Gut gesagt! Da die Schnittstelle der flexiblere Ansatz ist, sollten Sie wirklich rechtfertigen müssen, was die konkrete Implementierung für Sie bedeutet.

9 Stimmen

Eine großartige Denkweise. Trotzdem kann ich es beantworten: mein Grund heißt AddRange()

20voto

Diadistis Punkte 11787

IList<T> ist eine Schnittstelle, so dass Sie eine andere Klasse erben und trotzdem IList<T> implementieren können, während die Vererbung von List<T> Sie daran hindert, dies zu tun.

Wenn es zum Beispiel eine Klasse A gibt und Ihre Klasse B sie erbt, können Sie List<T> nicht verwenden.

class A : B, IList<T> { ... }

16voto

smack0007 Punkte 10526
public void Foo(IList<Bar> list)
{
     // Do Something with the list here.
}

In diesem Fall können Sie eine beliebige Klasse übergeben, die die Schnittstelle IList<Bar> implementiert. Wenn Sie stattdessen List<Bar> verwenden, kann nur eine List<Bar>-Instanz übergeben werden.

Die IList<Bar> Methode ist lockerer gekoppelt als die List<Bar> Methode.

15voto

annakata Punkte 72408

Ein Grundsatz von TDD und OOP im Allgemeinen ist die Programmierung für eine Schnittstelle und nicht für eine Implementierung.

In diesem speziellen Fall, da Sie im Wesentlichen über ein Sprachkonstrukt sprechen, nicht eine benutzerdefinierte es im Allgemeinen keine Rolle, aber sagen Sie zum Beispiel, dass Sie gefunden List nicht etwas, das Sie benötigen unterstützt. Wenn Sie IList im Rest der Anwendung verwendet hätten, könnten Sie List mit Ihrer eigenen benutzerdefinierten Klasse erweitern und diese ohne Refactoring weitergeben.

Die Kosten dafür sind minimal, warum sollten Sie sich später nicht die Kopfschmerzen ersparen? Das ist der Sinn des Schnittstellenprinzips.

4 Stimmen

Wenn Ihre ExtendedList<T> von List<T> erbt, dann können Sie sie immer noch in einen List<T>-Vertrag einfügen. Dieses Argument funktioniert nur, wenn du deine eigene Implementierung von IList<T> von Grund auf schreibst (oder zumindest ohne List<T> zu erben)

15voto

JasonS Punkte 6915

Erstaunlich, dass keine dieser Fragen (oder Antworten) zu List vs. IList den Signaturunterschied erwähnt. (Das ist, warum ich für diese Frage auf SO gesucht!)

Hier sind die in List enthaltenen Methoden, die in IList nicht zu finden sind, zumindest ab .NET 4.5 (ca. 2015)

  • AddRange
  • AsReadOnly
  • BinärSuche
  • Kapazität
  • ConvertAll
  • Existiert
  • finden.
  • FindAll
  • FindIndex
  • FindLast
  • FindLastIndex
  • ForEach
  • GetRange
  • InsertRange
  • LastIndexOf
  • RemoveAll
  • RemoveRange
  • Umgekehrt
  • Sortieren
  • ToArray
  • TrimExcess
  • TrueForAll

1 Stimmen

Das stimmt nicht ganz. Reverse y ToArray sind Erweiterungsmethoden für die Schnittstelle IEnumerable<T>, von der IList<T> abgeleitet ist.

0 Stimmen

Das liegt daran, dass diese nur Sinn machen in List s und nicht andere Implementierungen von IList .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X