2015-09-25 11 views
9

Ich schreibe einfache Bibliothek, die Liste der Namen zurückgibt.Welches Ergebnis sollte ich zurückgeben?

Aber, was ich sollte zurückkehrt, wenn ich nichts finden können?

return new List<String>(); 

oder

return null; 

Beispiel:

var resultColl=FindNames(...); 

Dieser Code kann von anderen Komponenten verwendet werden, und ich will nicht, es beschädigt. Wenn ich null zurückgebe - ich denke, es ist der richtige Weg, es zu überprüfen. Aber, kann ich leere Liste zurückgeben?

Vielen Dank.

+1

leere Liste wäre in Ordnung ich denke instad Null –

+0

Beachten Sie, dass Sie 'List ' überhaupt nicht zurückgeben sollten. Rückgabe leer 'IList ' oder, wenn es möglich ist, leer 'IEnumerable 'stattdessen. – Dennis

Antwort

15

Sie sollten immer leere Liste zurückgeben. Siehe Guidelines for Collections.

Geben Sie NULL-Werte NICHT von den Auflistungseigenschaften oder von den Methoden returning collections zurück. Geben Sie stattdessen eine leere Sammlung oder ein leeres Array zurück.

+1

absolut, vermeiden Sie so viel wie möglich 'null'. Es ist nur Bibliothek sollte einige leere Standard-Implementierungen angeboten werden. – zinking

2

Rückkehr leere Auflistung ist besser aus der Perspektive Design, da Client-Code muss nicht null Prüfung durchzuführen. Siehe Null Object pattern.

5

Ich würde Enumerable.Empty<string>() zurückgeben, oder wenn Ihre Methode eine Liste zurückgeben soll, tun Sie return new List<string>(). Wenn Sie viele Situationen haben, in denen Sie eine leere Liste zurückgeben müssen, könnten Sie eine statische Liste erstellen, die jedes Mal zurückgegeben wird. Dies würde verhindern, dass jedes Mal neue leere Listen erstellt werden müssen, wie von @YuvalItzchakov gezeigt.

Eine leere Sammlung ist besser als null da wäre es, zu saubereren Code meiner Meinung nach führen.

+1

Wahrscheinlich haben Sie 'Enumerable.Empty () .ToList();' –

+0

@YuvalItzchakov Warum? Wenn Sie diese Route gehen, tun Sie einfach 'neue Liste ();' – Rob

+1

@Rob Wenn das OP ein 'IEnumerable ' erhält, wird dies nicht kompilieren. Als er 'List ' benutzte, nahm ich an, dass er das benutzt. –

0

Eine ausführlichere Antwort wäre ein Tuple<bool, List<string>>. Dies ist eine klare Lösung, die modifiziert werden kann, andere Details über die Suche einbezogen:

var thereAreResults = foundList.Count > 0; 
return new Tuple<bool, List<String>>(thereAreResults, foundList); 
+0

Kein Grund vom Downvoter? – tomab

+1

Das ist ein schrecklich schreckliches Design. Es kompiliert auch nicht. – Rob

+1

Ich habe nicht abgestimmt, aber das scheint sinnlos, da der Anrufer nur 'Count' auf der zurückgegebenen Liste oder wahrscheinlicher iterate es in einer' foreach' aufrufen kann. Sie könnten auch 'tuple.create (thereAreReuullts, foundList);' stattdessen zurückgeben. – juharr

3

Es ist wahrscheinlich, dass der anrufende Code die Liste zu durchlaufen will, oder mit einer Liste etwas zu tun. Durch das Zurückgeben einer leeren Liste sollte der aufrufende Code gut funktionieren. Wenn Sie null zurückgeben, muss der aufrufende Code sicherstellen, dass sie zuerst eine Liste haben.

Es ist wahrscheinlich nur eine Frage der Präferenz, aber eine leere Liste zurückkehr bekommt meine Stimme ... bist du das Ding der Vertrag es zurückkommen würde, sagte der Rückkehr.

1

Das hängt von der Semantik Ihres Codes ab.

Wenn keine Ergebnisse ein akzeptables Ergebnis ist, dann sollten Sie eine leere Auflistung zurück.

Wenn keine Ergebnisse eine Fehlerbedingung sind, geben Sie null zurück.

+1

Wenn keine Ergebnisse eine Fehlerbedingung sind, ziehen Sie eine Ausnahme in Betracht! –

+0

@MatthewWatson du hast Recht, Ausnahme wäre besser als Null zurückgeben – Domysee

1

Ich würde vorschlagen, dass Sie in Einklang stehen, was Sie tun, wenn Sie nichts haben, zurückzukehren. Auf diese Weise wissen Sie immer, dass Sie für alles, was Sie anrufen, die gleiche Art von Antwort für nichts erwarten. So wie Sie wissen, dass Sie immer eine leere Menge oder eine leere Zeichenfolge oder 0 usw. zurückgeben werden.

Was tun Sie in Bezug auf die anderen Bibliothekselemente, die Sie haben?

5

die leere Liste zurückkehrend ist bequemer für die Nutzer Ihrer Funktion:

foreach (string name in FindNames(...)) 
{ 
    Display(name); 
} 

null Kräfte Ihre Anrufer zurückkehrend zusätzlichen Code zu schreiben:

  • einen Test für null und
  • eine zusätzliche lokale Variable (um zu vermeiden, dass Sie Ihre Funktion zweimal aufrufen müssen)

    List<string> names = FindNames(...); 
    
    if (names != null) 
    { 
        foreach (string name in names) 
        { 
         Display(name); 
        } 
    } 
    

Also eine leere Liste zurückgeben ist besser.

Verwandte Themen