首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么将List<Term>的参数重构为IEnumerable<Term>?

为什么将List<Term>的参数重构为IEnumerable<Term>?
EN

Stack Overflow用户
提问于 2011-12-13 20:38:01
回答 5查看 1.6K关注 0票数 9

我有一个看起来像这样的方法:

代码语言:javascript
复制
    public void UpdateTermInfo(List<Term> termInfoList)
    {
        foreach (Term termInfo in termInfoList)
        {
            UpdateTermInfo(termInfo);
        }
        m_xdoc.Save(FileName.FullName);
    }

Resharper建议我将方法签名改为IEnumerable<Term>而不是List<Term>。这样做的好处是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-14 00:03:06

其他答案指出,通过选择“较大”的类型,您可以允许更多的调用者呼叫您。这本身就是一个足够好的理由来做出这种改变。然而,还有其他原因。我建议您进行此更改,因为当我看到接受列表或数组的方法时,我想到的第一件事是“如果该方法试图更改列表/数组中的项怎么办?”

您需要存储桶的内容,但您不仅需要存储桶,还需要更改其内容的能力。如果你不打算使用这种能力,为什么你会要求这样做呢?当您说“此方法不能接受任何旧序列;它必须接受由整数索引的可变列表”时,我认为您是在对调用者提出要求,因为您将利用这种强大的

如果“我打算搞乱你的数据结构”不是你想要传达给方法调用者的,那么就不要传达这一点。一个接受序列的方法传达了“我要做的最多的事情就是按顺序从这个序列中读取”。

票数 17
EN

Stack Overflow用户

发布于 2011-12-13 20:40:27

简单地说,接受enumerable允许您的函数与更大范围的输入参数兼容,例如数组和LINQ查询。

要详细说明如何接受LINQ查询,可以这样做:

代码语言:javascript
复制
UpdateTermInfo(myTermList.Where(x => somefilter));

此外,指定一个接口而不是一个具体的类允许其他人提供他们自己的接口实现。通过这种方式,你是在“订阅”而不是“禁止”。(是的,我确实编造了一个词。)

一般而言(除了许多关于您希望保留哪些功能以备将来修改的例外情况),最佳实践是使用最通用的参数来实现函数。这为函数的使用者提供了最大的灵活性。

因此,如果您决意要对此函数使用列表(可能是因为您希望在以后使用诸如Count或索引运算符之类的属性),出于上述原因,我强烈建议您考虑使用IList<Term>而不是List<Term>

票数 6
EN

Stack Overflow用户

发布于 2011-12-13 20:43:14

List实现了IEnumerable,使用它将使事情变得更加灵活。如果一个实例出现在您不想使用List的地方,并且希望使用不同的集合对象,那么它可以很容易地从IEnumerable中转换出来。

例如,IEnumerable允许您使用Arrays和许多其他工具,而不是总是使用List

Inumerable只是一个项目的集合,不同于List,您可以添加、删除、排序、用于每个项目、计数等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8489375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档