2015-09-25 1 views
9

名前のリストを返す簡単なライブラリを作成します。私はどのような結果を返すべきですか?

しかし、何も見つからない場合はどうすればいいですか?

return new List<String>(); 

または

return null; 

例:

var resultColl=FindNames(...); 

このコードは、他のコンポーネントから使用することができ、私はそれを破損したくありません。 もし私がnullを返す - 私はそれを確認する正しい方法だと思います。しかし、私は空リストを返す必要がありますか?

ありがとうございます。

+1

空リストは、私がnullのinstadと思うかもしれません。 –

+0

'List 'を返さないように注意してください。空の 'IList 'を返すか、可能であれば 'IEnumerable 'を空にしてください。 – Dennis

答えて

15

常に空リストを返す必要があります。 Guidelines for Collectionsを参照してください。

コレクションプロパティまたはコレクション コレクションからnull値を戻してはなりません。代わりに空のコレクションまたは空の配列 を返します。

+1

絶対に、「ヌル」をできるだけ使用しないでください。それは単にライブラリがいくつかのデフォルトの空の実装を提供する必要があります。 – zinking

2

クライアントコードがヌルチェックを実行する必要がないため、空のコレクションを返す方が設計の観点から優れています。 Null Object patternを参照してください。

5

私はEnumerable.Empty<string>()を返します。または、あなたのメソッドがリストを返すと思われる場合は、return new List<string>()を実行します。空リストを返す必要がある状況がたくさんある場合は、毎回返される静的リストを作成すると、毎回新しい空リストを作成する必要がなくなります(@YuvalItzchakovによって指摘されています)。

空のコレクションはnullよりも優れています。私の意見では、よりクリーンなコードになるからです。

+1

あなたはおそらく 'Enumerable.Empty ().ToList();' –

+0

@YuvalItzchakovなぜですか?あなたがそのルートに行くなら、 'new List ();' – Rob

+1

@Rob OPが 'IEnumerable 'を受け取っていない限り、これはコンパイルされません。彼が 'List 'を使っていたので、私はそれが彼が使っているものと仮定しました。 –

0

詳細な回答はTuple<bool, List<string>>です。

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

ダウンボッターの理由はありませんか? – tomab

+1

これは恐ろしい恐ろしいデザインです。それもコンパイルされません。 – Rob

+1

私は投票しませんでしたが、これは、呼び出し側が返されたリストで単に 'Count'を呼び出すことができ、あるいは' foreach'で反復する可能性があるので、無意味なようです。また、単にTuple.Create(thereAreReullts、foundList);を返すこともできます。 – juharr

3

それは、呼び出し元のコードは、リストを反復処理したい、またはリストで何かをすることを可能性があります:これは、検索に関するその他の詳細を含むように変更することができる透明な溶液です。空のリストを返すことで、呼び出しコードが正常に動作するはずです。 nullを返すと、呼び出し側のコードは最初にリストを持つようにする必要があります。

それはおそらく、好みの問題だが、空のリストを返すことは...あなたは契約はそれが戻ってくると述べた事を返送している私の票を取得します。

1

これはコードの意味に依存します。

許容される結果が得られない場合は、空のコレクションを返す必要があります。

結果がエラー条件でない場合は、nullを戻します。

+1

結果がエラー状態でない場合は、例外をスローすることを検討してください。 –

+0

@MatthewWatsonあなたが正しいです、例外はnullを返すよりも良いでしょう – Domysee

1

私はあなたが返すことは何もないとき、あなたは何をすべきかで一貫していることを示唆しています。このようにして、あなたは何のためにも同じタイプの応答を期待するために何かを常に知っています。あなたが常に空のセットや空の文字列や0などを返すことを知るなど。

あなたが持っている他の図書館の項目に関してはどうしますか?空のリストを返す

5

は、あなたの関数のユーザーにとってより便利である:

余分なコードを書くために、ヌル力をあなたの発信者を返す
foreach (string name in FindNames(...)) 
{ 
    Display(name); 
} 

  • ヌルのためのテスト、および
  • 余分なローカル変数(関数を2回呼び出す必要がないように)

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

したがって、空のリストを返す方が良いです。

関連する問題