9

この質問にはすでに答えがあります。

私は名前のリストを返す単純なライブラリを書きます。

しかし、私は何も見つからない場合に何を返すべきですか?

return new List<String>();

または

return null;

例:

var resultColl=FindNames(...);

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

ありがとうございました。


  • 空のリストは大丈夫だろう私はnullのinstadだと思う - Ehsan Sajjad
  • 戻ることはできません。List<T>まったく空に戻すIList<T>または、可能であれば空IEnumerable<T>代わりに。 - Dennis

8 답변


15

あなたはいつも空のリストを返すべきです。を参照してくださいコレクションのためのガイドライン

コレクションプロパティまたはメソッドからnull値を返さないでください。   コレクションを返す空のコレクションまたは空の配列を返す   代わりに。


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

5

空のリストを返すことはあなたの関数のユーザーにとってより便利です:

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

nullを返すと、呼び出し側は追加のコードを書く必要があります。

  • nullのテスト
  • 追加のローカル変数(関数を2回呼び出す必要がないようにするため)

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

そのため、空のリストを返す方が良いでしょう。


5

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

空のコレクションはnullそれは、私の考えでは、よりクリーンなコードにつながるからです。


  • あなたはおそらく気づくEnumerable.Empty<string>().ToList(); - Yuval Itzchakov
  • @YuvalItzchakovなぜですか?あなたがそのルートを行くならば、ちょうどしなさいnew List<string>(); - Rob
  • OPが受け取っていない限り@RobIEnumerable<string>、これはコンパイルしません。彼が使ったようにList<string>、私は彼が使用しているものだと思いました。 - Yuval Itzchakov
  • @YuvalItzchakov:OPが何を期待しているのかわかりませんが、もしそうならList<string>それが変換される必要があるであろうと期待されているそしてそれからまたそれはEnumerable.Emptyの使用を冗長にするでしょう。 - npinti
  • @npintiその場合は、static List<string>性能的にはより良いでしょう。 - Yuval Itzchakov

3

呼び出し元のコードはリストを反復したい、またはListを使って何かをしたいと思うでしょう。空のListを返すことで、呼び出し元のコードは正常に機能するはずです。 nullを返した場合、呼び出し側のコードは最初にリストを持っていることを確認する必要があります。

それはおそらく単なる好みの問題です、しかし空のリストを返すことは私の投票を得ます...あなたは契約がそれが返すだろうと言ったものを返しています。


2

クライアントコードはnullチェックを実行する必要がないため、空のコレクションを返す方がデザインの観点からは優れています。見るヌルオブジェクトパターン


1

それはあなたのコードの意味によって異なります。

結果が受け入れられない場合は、空のコレクションを返す必要があります。

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


  • 結果がエラー状態でなければ、例外をスローすることを検討してください。 - Matthew Watson
  • @MatthewWatsonそのとおりです、例外はnullを返すよりも優れているでしょう - Domysee

1

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

あなたが持っている他の図書館アイテムに関してあなたは何をしますか?


0

より詳細な答えはTuple<bool, List<string>>。これはあなたの検索に関する他の詳細を含むように修正することができる明確な解決策です:

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


  • 投票者からの理由はありませんか。 - tomab
  • それは恐ろしい恐ろしいデザインです。また、コンパイルもしません。 - Rob
  • 投票はしませんでしたが、発信者はただ電話をかけることができるので無意味です。Count返されたリスト上、またはより多くのforeach。またあなただけreturn Tuple.Create(thereAreReullts, foundList);代わりに。 - juharr
  • 強調は、単なる空のList()よりも多くの情報を含める方法でした。でも気にしないで。 - tomab

リンクされた質問


最近の質問