Angenommen, ich habe eine Methode
public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
List<User> users = new List<User>();
// some database stuff
return users;
}
Ich habe gelesen, dass es besser wäre, eine Schnittstelle (entweder IList
oder IEnumerable
) zurückzugeben, als eine zurückzugeben List
. Einige Argumente, die ich dafür gehört habe, sind, dass es Daten verbirgt und dem API-Entwickler die Flexibilität gibt, die interne Darstellung der Daten zu einem späteren Zeitpunkt zu ändern.
Ich mache mir Sorgen, IEnumerable
dass Sie nur Funktionen zurückgeben, z. B. den wahlfreien Zugriff und die Count
Eigenschaft.
Ich weiß, dass das Akzeptieren eines IEnumerable
als Parameter sinnvoll ist, da es dem Verbraucher die beste Flexibilität bietet, Daten an meine Methode zu senden, die minimalistischen Anforderungen für die Funktionsweise der Methode.
Was ist die beste Vorgehensweise für den Rückgabetyp?
quelle
Antworten:
Im Allgemeinen können Sie mit Schnittstellen beginnen und den konkreten Typ nur dann als Rückgabetyp festlegen, wenn Sie feststellen, dass Sie die zusätzlichen Methoden häufiger als erwartet verwenden.
Wenn Sie eine Schnittstelle zurückgeben, behalten Sie mehr Flexibilität. Sie können die Implementierung später ändern, um einen anderen konkreten Typ zurückzugeben. Andererseits gibt es dem Anrufer offensichtlich weniger Informationen, so dass er möglicherweise bestimmte Vorgänge nicht ausführen kann. (Beispiel: Wenn Sie zurückkehren
List<T>
, kann der Aufrufer ConvertAll usw. verwenden, was er nicht kann, wenn Sie nur erklären, dass Sie zurückkehrenIList<T>
.) In einigen Situationen lohnt es sich, den konkreten Typ anzugeben.In Bezug auf die Count- oder Sortiermethode gibt es dafür keine Standard-Erfassungsschnittstellen. Sie können jedoch eine Erweiterungsmethode schreiben, um IList zu sortieren oder zu zählen.
quelle
Wenn Sie eine Sammlung benötigen, können
Count
Sie diese verwendenICollection<T>
, was allgemein genug ist.quelle
Sie geben zurück, was für die von Ihnen definierte Methode sinnvoll ist. Gibt das, was Sie tun, eine Reihe von Elementen zurück (der Fokus liegt auf den Elementen), oder gibt es eine Sammlung von Elementen zurück (der Fokus liegt auf der Sammlung als Ganzes)? Lohnt es sich, Abweichungen bei der Implementierung der Sammlung zuzulassen? Wenn es nie Sinn macht, einen Generator zu verwenden, oder verwenden Sie
HashSet
einfach denList
.quelle
Spezifisch für die Beispielmethode: Sie haben Recht, dass eine Rückgabe
IEnmuerable<T>
bedeuten würde, dass Sie die FunktionalitätCount
und Indizierung verlieren würden (obwohl Sie LINQ-Methoden verwenden könntenCount()
undElementAt()
diese effizient implementiert werden, wenn der Typ, für den sie verwendet werden, tatsächlich implementiert wirdIList<T>
).Wenn Sie zurückkehren
IList<T>
, verlieren Sie einige Funktionen, aber der Gewinn an Allgemeinheit ist es wahrscheinlich wert.Aber noch besser wäre etwas zwischen
IEnumerable<T>
undIList<T>
, da es für den Verbraucher höchstwahrscheinlich keinen Sinn macht, die zurückgegebene Sammlung zu mutieren, aber es für ihn sinnvoll ist, sie zu verwendenCount
oder zu indizieren.In .Net 4.5 gibt es eine solche Schnittstelle :
IReadOnlyList<T>
.quelle
IReadOnlyList
klingt gut, wenn ich VS2013 bekommen kann, danke!