2

foreach ループで繰り返し処理しようとしているオブジェクトが null の場合、例外をスローする理由は何ですか?

たとえば、次のコードは例外をスローします。

public void Test()
{
    IEnumerable<int> numbers = null;

    foreach (var number in numbers)
    {
        //Do stuff
    }
}

これで、修正は簡単になりました。foreach ループの前に null をチェックするだけです。

public void Test()
{
    IEnumerable<int> numbers = null;

    if (numbers != null)
    {
        foreach (var number in numbers)
        {
            //Do stuff
        }
    }
}

私の考えでは、foreach ループでできることはすべて、通常の for ループだけでできるため、foreach ループは基本的に存在します。なぜなら、書くのがより便利で読みやすいからです。重要な部分は、書きやすいということです。何かが便利になるように作成されている場合は、最後まで行ってみませんか。この場合、null チェックを暗黙的に行います。コレクションがnullの場合に実際に例外をスローしたい場合があるかもしれませんが、それらははるかに少数派であり、明示的でnullをチェックする必要がある場合であるべきだと思います. 次のようなもの:

public static void Test()
{
    IEnumerable<int> numbers = null;

    if (numbers == null)
        throw new NullReferenceException();

    foreach (var number in numbers)
    {
        //Do stuff
    }
}
4

2 に答える 2

4

いいえ.. aforeachは列挙子に変わります.. 基本的に、foreachonnumbersはこれを行います:

var enumerator = numbers.GetEnumerator();

..他の呼び出しと同様に、null参照に対するメソッド呼び出しはNullReferenceException.

于 2013-09-23T23:49:27.383 に答える