2012-03-05 5 views
3

拡張メソッドでは、開いている汎用IEnumerableが必要です。渡されたリストを確認する必要があります<T>がnullです

リスト内のメソッドをチェックする必要があります。リストはnullです。

私はリストがnullにすることはできませんという意見を持っていますが、このようなケースを処理するにはどうすればよいカウント== 0です

がありますか?

UPDATE:

私はこの方法は、リストを再帰的に当然のことながら渡さ/と呼ばれる再帰的な方法であることを言及するのを忘れてしまいました。

答えて

1

はい、確認する必要があります。これは、特にLINQで、このような場合に投げることもかなり一般的なパターンです:空のリストを取り扱い

public static void MyExtension<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 

    // ... 
} 

がnullであるリストのインスタンスを扱うよりもはるかに簡単です。このように考えてみてください。アイテムのないリストは単純に空のコレクションです - かなり一般的なケースです。 nullのリストは何を表していますか? 例外的な状況、そのように扱う必要があります。

更新:

私は、MicrosoftがANEを投げることは一般的なパターン(CLRスローNREせることとは対照的に、 - の点であまりにも漠然としたかもしれない)であることを私の憶測について言っているものに周りを見回したとそれはそう正しいこと。そのアプリケーションコードがnull引数とnullではない引数によって引き起こされた例外によって引き起こされた例外の間を区別することができるように

例外ArgumentNullException(...)が提供されています。私たちは、そのANE documentation pageで見つけることができます。

以降、フレームワークの設計ガイドラインException Throwingセクションで:

例外をスローすることによって、レポート実行の失敗を行います。メンバーが設計したものを正常に実行できない場合は、の実行に失敗したとみなし、例外をスローする必要があります。あなたのケースでは

あなたのメソッドがnull list引数を受け入れてはいけません述べたことから、それは簡単な実行失敗状況です。

+0

私は自分の質問を更新しました。メソッドが呼び出された場合に、フレームワークがNull例外をスローする場合、なぜ引数例外をスローするのですか? – Pascal

+0

ChrisFが(彼は彼のソリューションを後で編集した)前にArgumentNullExceptionについてアドバイスしました:) – Pascal

+0

@Pascal:ありがとう。私はいくつかの設計ガイドラインを確認しましたが、ANEを投げるのは確かに推奨パターンです。私の更新された答えを見てください。 –

-1

更新:それが依存

public static void ExtensionMethod<T>(this IEnumerable<T> list, 
             IEnumerable<T> anOtherlist) 
{ 
    bool listItselfNotNull = list != null; 
    bool anOtherListNotNull = anOtherList != null; 
} 
+2

null *オブジェクトの拡張メソッドを呼び出すことはできますか? –

+2

'null'に拡張メソッドを使用することは可能です。 – Lukazoid

+1

うわー、それは本当にヌルの拡張メソッドを呼び出すことができます:) –

6

私はあなたがメソッドのパラメータとしてリストを渡すが、この場合溶液中で明らかにされることを意味すると考えている(でも、オブジェクト自体をチェックします)。

ヌルいるリストは、あなたがそれのためのテストを処理し、ArgumentNullExceptionを上げることができない何かである場合:nullのもののリストが要素を既存ませんが持つリストと等価である場合

if (list == null) 
{ 
    throw new ArgumentNullException("some suitable message"); 
} 

、その後を可能にその:空のインスタンスとしてnullを扱う

if (list == null || list.Count() == 0) 
{ 
    ..... 
} 
0

(サードパーティのコードを使用している場合、ESP)通常、私は時々例外を取得したいが、より便利である:

public static class FrameworkExtensions 
{ 
    /// <summary> 
    /// null tolerant access to a Collection 
    /// 
    /// usage: 
    /// foreach (int i in returnArray.AsNotNull()) 
    /// { 
    ///  // do some more stuff 
    /// } 
    /// </summary> 
    /// <typeparam name="T">Type of collection</typeparam> 
    /// <param name="original"></param> 
    /// <returns></returns> 
    public static IEnumerable<T> AsNotNull<T>(this IEnumerable<T> original) 
    { 
     return original ?? new T[0]; 
    } 
} 
関連する問題