Gibt leere ListT oder null zurück, wenn keine Listenelemente vorhanden sind?

7

Wenn ich eine Methode habe, die eine Sammlung von Objekten zurückgibt, was sollte ich zurückgeben, wenn die Anzahl der Objekte null ist? null oder einfach leer List<T> ? Was ist eine gute Praxis?

%Vor%     
Neir0 07.08.2011, 07:56
quelle

8 Antworten

15

Ich würde definitiv eine leere Liste zurückgeben, so dass Methoden immer noch für das Objekt aufgerufen werden können, ohne dass Null-Checks erforderlich sind. Es gibt einen Unterschied zwischen dem Zurückgeben einer leeren Liste und dem Zurückgeben von nichts, so dass der aufrufende Code wahrscheinlich sowieso nicht erwartet, eine Null-Referenz zu erhalten (außer eine Ausnahme auftritt oder so).

    
BoltClock 07.08.2011, 07:58
quelle
3

Eine leere Liste ist, was ich als Anrufer erwarten würde. Null würde mir anzeigen, dass die "konzeptionelle Liste" nicht definiert ist, wie Null in einer Datenbank.

Außerdem werden Clients wie diese niemals fehlschlagen, wenn sie immer leere Sammlungen anstelle von null zurückgeben:

%Vor%     
Jörgen Sigvardsson 07.08.2011 08:05
quelle
3

Es hängt von einer Reihe von Faktoren ab, aber eine leere Liste wäre ein typischer Rückgabewert, da der Aufrufer andernfalls null checking ausführen muss. Die Hauptzeit, die ich null zurückgeben würde, wäre, wenn es eine Methode dieses Stils wäre:

%Vor%

Der Aufrufer erwartet (beim Empfang von false ), nicht einmal bei dem Wert von result zu sehen.

Wenn Sie Arrays zurückgeben, gibt es einen netten Cheat - Sie können ein typisiertes Array der Länge Null in einem statischen Feld speichern, das irgendwo zurückgegeben wird. Aber letztendlich wird eine leere Liste keinen riesigen Overhead für die Zuweisung sein, also schick einfach das.

    
Marc Gravell 07.08.2011 07:59
quelle
2

Laut MS sollten Sie niemals einen Null-String oder ein Array aus einem Feld oder einer Eigenschaft zurückgeben, und ich denke, dass dies auf Methoden erweitert werden könnte (und möglicherweise auch irgendwo, das ich nicht gefunden habe).

Beim Zurückgeben leerer Arrays:

  

String- und Array-Eigenschaften sollten niemals eine Nullreferenz zurückgeben. Null kann in diesem Zusammenhang schwierig zu verstehen sein.

     

Die allgemeine Regel besagt, dass leere, leere ("") und leere (0 Elemente) Arrays auf die gleiche Weise behandelt werden sollten. Gibt ein leeres Array anstelle eines Nullverweises zurück.

MSDN-Referenz .

    
Grant Thomas 07.08.2011 08:15
quelle
1

ist diese Methode eine ifc-Methode? was bedeutet das von externen Objekten, die nicht von Ihnen gesteuert werden? Wenn die Antwort ja lautet, würde ich eine leere Sammlung zurückgeben, da der Aufrufer keine Ausnahme erwartet.

Wenn diese Methode intern ist und Sie der einzige Benutzer sind, würde ich null ausgeben, um den verschwendeten Speicher für eine leere Sammlung und einen GC-Performance-Treffer zu speichern, sobald Sie ihn nicht mehr benutzen.

    
user851361 07.08.2011 08:01
quelle
1

Besser ist es, IEnumerable<string> zurückzugeben. Verwenden Sie yield return und yield break innerhalb Ihrer Methode, um Ihre Sammlung aufzubauen. Auf diese Weise verschieben Sie die Erstellung des Arrays. Schauen Sie hier nach, um weitere Informationen zu erhalten. Sie finden IEnumerable hat den Vorteil, dass es innerhalb von Erweiterungsmethoden und linq-Abfragen verkettet werden kann:

%Vor%

Wenn Sie unbedingt eine vollständige Liste zurückgeben müssen (wegen der Faulheit von yield ), würde ich empfehlen, Ihre Methodensignatur wie folgt zu ändern:

%Vor%

Diese Technik hat drei Vorteile.

  1. Ihre Absichten sind klar - Schüler werden initialisiert, wenn der Rückgabewert wahr ist. Ein Nutzer Ihres Codes muss nicht erraten, auf welche Praxis Sie sich festgelegt haben.
  2. Sie werden natürlich nicht sich bemühen, eine Liste zuzuordnen, falls die Sammlung leer ist, was Speicherzuweisungen spart.
  3. ICollection<string> wird stark typisiert, ohne den von Ihnen verwendeten Speichermechanismus zu zeigen. Zurückkehrende konkrete Klassen sollten sparsam verwendet werden. Alternativen sind Dinge wie IList<string> , ReadOnlyCollection<string> und IEnumerable<string> , aber der von Ihnen gewählte wählt sicherlich Ihre Absichten, was der Benutzer mit den Ergebnissen tun kann und was nicht, viel klarer.
Michael Hays 07.08.2011 08:12
quelle
1

Immer Return Empty Liste. Und Sie vermeiden die am häufigsten auftretende Ausnahme - NullReferenceException .

    
Oleg Dudnyk 07.08.2011 09:50
quelle
0

Es hängt wirklich vom Kontext ab, in dem Ihr Code verwendet wird. Für die meisten Zwecke gebe ich eine Liste von null Objekten zurück, und ich denke, es wäre auch hier am besten - es ist konsistenter mit Ihren normalen Ergebnissen.

    
foxy 07.08.2011 07:59
quelle

Tags und Links