【问题标题】:Resharper says I shouldn't use List<T>Resharper 说我不应该使用 List<T>
【发布时间】:2011-05-28 07:36:15
【问题描述】:

我有一个方法:

static void FileChangesDetected(List<ChangedFiles> files)

我使用了 Visual Studio 2010 和 Resharper。 Resharper 总是建议我将List&lt;T&gt; 更改为IEnumerable&lt;T&gt;,我想知道这是为什么。

在方法中,我只是这样做:

 foreach (var file in files)
 { ... }

使用IEnumerable&lt;T&gt; 而不是List&lt;T&gt; 有什么好处吗?

【问题讨论】:

    标签: c# list resharper ienumerable


    【解决方案1】:

    这一切都与LSP(Liskov 替换原则)有关。

    基本上,与其使用实现,不如编写抽象代码。

    在这种特定情况下,如果您所做的只是遍历列表,您可以使用IEnumerable&lt;T&gt; 作为最简单的抽象——这样您就没有使用List&lt;T&gt;,但是任何你的函数中的集合类型。

    这可以让你的函数更加可重用并减少coupling

    【讨论】:

    • IEnumerable 比 ICollection 简单
    • IEnumerable,不是 ICollection。
    • 谢谢。是因为使用 IEnumerable/ICollection 使用的系统资源更少,还是因为 List 提供了更多我没有使用的方法,比使用 List 更有效?
    • @cdotlister - 它与资源无关,而与软件设计有关。 设计更好。
    • @cdolister - 例如,假设我已经有一个(老派,或者只是设计不那么好的)库方法,它返回一个数组......它是 IEnumerable,但不是一个列表...所以我可以将您有用的FastForward(IEnumerable&lt;Time&gt;) 方法传递给它,而无需先将其转换为列表。
    【解决方案2】:

    Resharper 建议您的方法实际上不需要将List&lt;T&gt; 作为参数,并且可以轻松地使用IEnumerable&lt;T&gt;。这意味着您可以使您的方法更通用。

    【讨论】:

      【解决方案3】:

      如果你只是迭代你的files,那么它不必是一个列表。您的代码也适用于数组。或更笼统地说:它适用于您可以迭代的任何东西。这由 IEnumerable 表示。所以 List 的使用限制了你消息的使用,没有任何必要。 ReSharper 方法只是一个提示。

      【讨论】:

        【解决方案4】:

        因为在您的代码中,您只使用了 filesIEnumerable&lt;ChangedFiles&gt; 的事实,您不使用例如 Count 或 Add。

        即使稍后您想使用 List 特定的方法(使用 Add 或 Count 方法),使用接口总是更好:IList&lt;ChangedFiles&gt; 而不是具体的实现。

        【讨论】:

          【解决方案5】:

          即使将 foreach 更改为,您仍然可以使用

          IEnumerable<ChangedFiles>
          

          ICollection<ChangedFiles>
          

          【讨论】:

            猜你喜欢
            • 2023-04-11
            • 2023-04-01
            • 2011-07-03
            • 2012-06-23
            • 2012-01-28
            • 2010-09-21
            • 2012-08-02
            • 2011-04-21
            • 1970-01-01
            相关资源
            最近更新 更多