9 Stimmen

Warum das Argument von List<Term> zu IEnumerable<Term> umgestalten?

Ich habe eine Methode, die wie folgt aussieht:

    public void UpdateTermInfo(List<Term> termInfoList)
    {
        foreach (Term termInfo in termInfoList)
        {
            UpdateTermInfo(termInfo);
        }
        m_xdoc.Save(FileName.FullName);
    }

Resharper rät mir, die Methodensignatur zu ändern in IEnumerable<Term> anstelle von List<Term> . Was ist der Vorteil dieser Vorgehensweise?

17voto

Eric Lippert Punkte 628543

In den anderen Antworten wird darauf hingewiesen, dass Sie durch die Wahl eines "größeren" Typs einer größeren Anzahl von Anrufern die Möglichkeit geben, Sie anzurufen. Das ist an sich schon ein guter Grund, diese Änderung vorzunehmen. Es gibt jedoch noch weitere Gründe. Ich würde Ihnen empfehlen, diese Änderung vorzunehmen, denn wenn ich eine Methode sehe, die eine Liste oder ein Array aufnimmt, denke ich als erstes: "Was ist, wenn diese Methode versucht, ein Element in meiner Liste/ meinem Array zu ändern?"

Sie wollen den Inhalt eines Eimers, aber Sie benötigen nicht nur den Eimer, sondern auch die Möglichkeit, seinen Inhalt zu ändern. Warum sollten Sie das verlangen, wenn Sie diese Fähigkeit nicht nutzen werden? Wenn Sie sagen: "Diese Methode kann nicht irgendeine alte Sequenz nehmen; sie muss eine veränderbare Liste, die durch ganze Zahlen indiziert ist " Ich denke, dass Sie diese Anforderung an den Anrufer stellen weil Sie diese Macht ausnutzen werden. .

Wenn "Ich habe vor, deine Datenstruktur durcheinander zu bringen" nicht das ist, was du dem Aufrufer der Methode mitteilen willst, dann teile das nicht mit. Eine Methode, die eine Sequenz aufnimmt, kommuniziert: "Das meiste, was ich tun werde, ist, diese Sequenz der Reihe nach zu lesen".

6voto

David Pfeffer Punkte 37541

Einfach ausgedrückt, ermöglicht die Annahme eines enumerable Ihrer Funktion, mit einem breiteren Bereich von Eingabeargumenten, wie Arrays und LINQ-Abfragen, kompatibel zu sein.

Um die Annahme von LINQ-Abfragen zu vertiefen, könnte man dies tun:

UpdateTermInfo(myTermList.Where(x => somefilter));

Außerdem ermöglicht die Angabe einer Schnittstelle anstelle einer konkreten Klasse anderen, ihre eigene Implementierung dieser Schnittstelle bereitzustellen. Auf diese Weise sind Sie eher "subscriptive" als "proscriptive". (Ja, ich habe gerade ein Wort erfunden.)

Im Allgemeinen (mit vielen Ausnahmen, die sich auf die Art der Fähigkeiten beziehen, die Sie für mögliche spätere Änderungen reservieren wollen) ist es eine bewährte Praxis, Funktionen mit möglichst allgemeinen Argumenten zu implementieren. Dies gibt dem Benutzer Ihrer Funktion maximale Flexibilität.

Wenn Sie also fest entschlossen sind, eine Liste für diese Funktion zu verwenden (vielleicht weil Sie zu einem späteren Zeitpunkt erwarten, dass Sie Eigenschaften wie Count oder den Index-Operator), würde ich Ihnen dringend raten, die Verwendung von IList<Term> anstelle von List<Term> aus den oben genannten Gründen.

3voto

Lloyd Powell Punkte 17593

List implementiert IEnumerable Die Verwendung dieser Methode würde die Dinge flexibler machen. Wenn ein Fall auftritt, in dem Sie keine List und ein anderes Sammelobjekt verwenden wollte, würde es von IEnumerable mit Leichtigkeit.

Zum Beispiel IEnumerable ermöglicht Ihnen die Verwendung von Arrays und viele andere, im Gegensatz zur ständigen Verwendung einer List .

Inumerable ist einfach eine Sammlung von Gegenständen, anders als bei einer List , wo Sie hinzufügen, entfernen, sortieren, For Each, Count usw. verwenden können.

0voto

György Andrasek Punkte 7947

Der Hauptgedanke hinter dieser Umstrukturierung ist, dass Sie die Methode allgemeiner gestalten. Sie sagen nicht, welche Datenstruktur Sie wollen, sondern nur, was Sie von ihr brauchen: dass Sie durch ihre Elemente iterieren können.

Wenn Sie also später entscheiden, dass Ihnen die O(n)-Suche nicht ausreicht, müssen Sie nur eine Zeile ändern und weitergehen.

0voto

Azhar Khorasany Punkte 2672

Wenn Sie List verwenden, beschränken Sie sich darauf, nur eine konkrete Implementierung von List zu verwenden, während Sie mit IEnumerable Arrays, Listen und Sammlungen übergeben können, da sie alle diese Schnittstelle implementieren.

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