5

foreach または LINQ クエリを使用して an を反復処理する前に、 an が null であるかどうかを確認するという問題に頻繁に直面しIEnumerable<T>ます。その後、次のようなコードになることがよくあります。

var myProjection = (myList ?? Enumerable.Empty<T>()).Select(x => x.Foo)...

したがって、この拡張メソッドを Extensions クラスに追加することを考えました。

public static class MyExtensions 
{
    public static IEnumerable<T> AsEmptyIfNull<T>(this IEnumerable<T> source)
    {
        return source ?? Enumerable.Empty<T>();
    }
}

このコードを見てすぐにちょっとした問題が頭に浮かびます。つまり、拡張メソッドの「インスタンス メソッドの側面」を考えると、単なる静的メソッドとして実装する必要があります。そうでなければ、このようなものは完全に合法です。

IEnumerable<int> list = null;
list.AsEmptyIfNull();

それを使用する上で他に欠点はありますか?
このような拡張機能が大量に使用された場合、開発者に何らかの悪い傾向をもたらす可能性はありますか?


おまけの質問:

より良い名前を提案できますか? :)
(英語は私の母国語ではないので、ネーミングは苦手です...)

前もって感謝します。

4

2 に答える 2

7

を返すメソッドはIEnumerable<T>、null ではなく空のものを返す必要があります。したがって、これは必要ありません。

この質問を参照してください: Is it better to return null or empty collection?

それ以外の場合、コードは問題ないようです。

于 2011-04-12T19:18:32.670 に答える
3

null制御できる場合、空のシーケンスの代わりにa を返すことは一般的に悪い考えです。nullこれは、誰かがコレクションを作成するように依頼されたときに戻ることは、「コレクションは空です」と言うのではなく、「そのようなコレクションはまったくありません」と言うようなものであると考えれば自明です。

列挙型を返すメソッドを所有している場合は、空を返すIEnumerable(大量に返される可能性がある場合は、特別な目的の読み取り専用の静的オブジェクトでさえある可能性があります) という方法があります。

そのような場合に戻る習慣のあるマナーの悪いライブラリを使用せざるを得ないnull場合は、この拡張メソッドが解決策になる可能性がありますが、やはり私はそれを好みません。マナーの悪いメソッドを独自のバージョンにラップして、人々がそれを見ないところで合体を行う方がおそらく良いでしょう。このようにして、代わりに常に列挙可能にするという便利nullさと、「return null」パラダイムをサポートしないという正確さの両方を得ることができます。

于 2011-04-12T19:27:45.497 に答える