2

などの拡張メソッドを使用するときに実際に何が起こるかを考えずに、多くの拡張メソッドを使用し.ToList()ます。.Reverse()これらのメソッドが正確に何をするのかを知るためにグーグルで検索してきましたが、どこにも見つからないようです。.toList()Visual Studio で を使用して " Go to definition" をクリックすると、表示されるのは

         // Summary:
        //     Creates a System.Collections.Generic.List<T> from an System.Collections.Generic.IEnumerable<T>.
        //
        // Parameters:
        //   source:
        //     The System.Collections.Generic.IEnumerable<T> to create a System.Collections.Generic.List<T>
        //     from.
        //
       ...etc

.Reverse();(たとえば)メソッド内で何が起こっているのかを調べようとしています。スタックを使用しますか、単にこのようなことをしますか...?

public static List<string> Reverse(List<string> oldList)
{
List<string> newList = new List<string>();    
for (int i = oldList.Count-1; i >= 0; i --)
    {
    newList.Add(oldList[i]);
    }
    return newList;
}

注:実際にこのようなものになるとは想像できませんが、私の質問を明確にするためです。

これらの方法が正確に何をするかを示すサイト/本/私がチェックできるものはありますか?

4

5 に答える 5

4

[定義に移動] をクリックすると、Microsoft ソース サーバーから .Net Framework のソース コードを読み込むように Visual Studio を構成できます。ここにいくつかの手順があります: http://referencesource.microsoft.com/downloadsetup.aspx

大きなパッケージをダウンロードする必要はありません。オプションを設定するだけで十分です。

のソースコードは次のToListとおりです。

    public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) { 
        if (source == null) throw Error.ArgumentNull("source");
        return new List<TSource>(source); 
    } 

のソースコードは次のReverseとおりです。

    public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source) {
        if (source == null) throw Error.ArgumentNull("source"); 
        return ReverseIterator<TSource>(source);
    }

    static IEnumerable<TSource> ReverseIterator<TSource>(IEnumerable<TSource> source) { 
        Buffer<TSource> buffer = new Buffer<TSource>(source);
        for (int i = buffer.count - 1; i >= 0; i--) yield return buffer.items[i]; 
    } 
于 2012-08-10T16:43:20.310 に答える
2

.ToList()する:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    return new List<TSource>(source);
}

そして、リストの基になる配列でArray.Reverse.Reverse()を呼び出します。

Reflector で逆コンパイルして見つけたのですが、.NET のソースを見てみるのもいいかもしれません。

于 2012-08-10T16:40:52.510 に答える
1

拡張メソッドは単なる古い静的メソッドですが、拡張するクラスのオブジェクトはパラメーターとして渡されます。では、組み込みクラス int を拡張してメソッドを含めたいとしましょうtoString()(はい、わかっています。既にメソッドが含まれています)。構文は次のようになります。

public static string toString(this int myInt)
{
     return (string)myInt;
}

thisパラメータのキーワードに注意してください。これは、これが拡張メソッドであることをコンパイラに伝えます。

于 2012-08-10T16:43:40.023 に答える
1

Jon Skeet (彼がここで私を打ち負かさなければ) は、 Linq to Objects を (多かれ少なかれ) 再実装する素晴らしい (そして長い)一連のブログ記事を書いています。ここにリストしたものを含め、すべてのメソッドの彼の実装 (通常はライブラリの実装と同じか類似している) を見ることができます。

の場合、Reverseあなたの実装とライブラリ (および Jon の) 実装の主な違いの 1 つは実行の違いです。 必要になるまで (この場合は、最初の項目が要求されたとき) 渡されたReverseの要素を列挙しません。IEnumerableその違いがもたらす結果の詳細な分析は、そのブログ シリーズに任せます。

于 2012-08-10T16:39:09.947 に答える
1

dotPeekなどのツールを使用して、コードを参照できます。

于 2012-08-10T16:41:32.977 に答える