1

.Net での Enumerable.Rangeの正確な実装は何ですか? 好ましい.Net 4?生成された for ループですか? カスタム実装 (IEnumerable、IEnumerator) または?

4

4 に答える 4

1

Reflectorを使用して、実装を自分で確認できます。引数をチェックし、呼び出し時に例外をスローするため、Rangeメソッド自体はイテレータメソッドではありません。イテレータメソッドである別のメソッドを呼び出します。ライセンスの制限により、正確なコードを投稿することはできません。

于 2009-10-05T13:45:35.160 に答える
1

この質問に対する受け入れられた回答は、あなたに答えを与えるはずです:

public static class Enumerable {
    public static IEnumerable<int> Range(int start, int count) {
        var end = start + count;
        for(var current = start; current < end; ++current) {
            yield return current;
        }
    }
}

これは正確なコードではありません。メソッド内で多くのエラー チェックなどが行われ、Range内部的に他のメソッドが呼び出されるためです。ただし、上記の引用されたコードはRangeルーチンの「本質」です。

Reflectorでコードを調べると、さらに多くの情報が得られるはずです。

于 2009-10-05T13:57:44.220 に答える
1

Reflector 出力のわずかではあるが重要な違い (および CraigTP の回答とそのコメントに記載されている引数チェックと追加レベルの内部化):

public static IEnumerable<int> Range(int start, int count) {
    for(int current = 0; current < count; ++current) {
        yield return start + current;
    }
}

つまり、別のローカル変数の代わりに、利回りごとに追加の追加を適用します。

于 2010-05-28T14:59:15.057 に答える