2

我使用了很多扩展方法,比如.ToList()等等.Reverse(),而没有真正考虑在我使用它们时到底发生了什么。我一直在谷歌上搜索以找出这些方法的确切作用,但我似乎无法在任何地方找到它们。当我.toList()在 Visual Studio 中使用 a 并单击“ 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

当您单击“转到定义”时,您可以将 Visual Studio 配置为从 Microsoft 源服务器加载 .Net Framework 的源代码。以下是一些说明: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);
}

并在列表的基础数组上.Reverse()调用Array.Reverse 。

我是通过使用 Reflector 反编译发现的,但您也可以查看.NET 源代码

于 2012-08-10T16:40:52.510 回答
1

Jon Skeet(如果他没有在这方面打败我的话)写了一系列精彩(而且很长)的博客文章,其中他(或多或少)重新实现了 Linq to Objects。您可以看到他的所有方法的实现(通常与库实现相同或相似),包括您在此处列出的方法。

在 的情况下Reverse,您的实现与库(和 Jon 的)实现之间的一个主要区别是执行不同。 Reverse直到它必须枚举传入的任何元素IEnumerable(在这种情况下,它是在请求第一项时)。我将对该差异的后果的更深入分析留给该博客系列。

于 2012-08-10T16:39:09.947 回答
1

您可以使用dotPeek之类的工具来浏览代码。

于 2012-08-10T16:41:32.977 回答
1

扩展方法只是一个普通的旧静态方法,但是您要扩展其类的对象作为参数传递给它。所以假设我们想扩展内置类 int 以包含一个toString()方法(是的,我知道,它已经有一个)。语法如下所示:

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

注意this参数的关键字。这告诉编译器这是一个扩展方法。

于 2012-08-10T16:43:40.023 回答