我有一个看起来像这样的方法:
public void UpdateTermInfo(List<Term> termInfoList)
{
foreach (Term termInfo in termInfoList)
{
UpdateTermInfo(termInfo);
}
m_xdoc.Save(FileName.FullName);
}Resharper建议我将方法签名改为IEnumerable<Term>而不是List<Term>。这样做的好处是什么?
发布于 2011-12-14 00:03:06
其他答案指出,通过选择“较大”的类型,您可以允许更多的调用者呼叫您。这本身就是一个足够好的理由来做出这种改变。然而,还有其他原因。我建议您进行此更改,因为当我看到接受列表或数组的方法时,我想到的第一件事是“如果该方法试图更改列表/数组中的项怎么办?”
您需要存储桶的内容,但您不仅需要存储桶,还需要更改其内容的能力。如果你不打算使用这种能力,为什么你会要求这样做呢?当您说“此方法不能接受任何旧序列;它必须接受由整数索引的可变列表”时,我认为您是在对调用者提出要求,因为您将利用这种强大的。
如果“我打算搞乱你的数据结构”不是你想要传达给方法调用者的,那么就不要传达这一点。一个接受序列的方法传达了“我要做的最多的事情就是按顺序从这个序列中读取”。
发布于 2011-12-13 20:40:27
简单地说,接受enumerable允许您的函数与更大范围的输入参数兼容,例如数组和LINQ查询。
要详细说明如何接受LINQ查询,可以这样做:
UpdateTermInfo(myTermList.Where(x => somefilter));此外,指定一个接口而不是一个具体的类允许其他人提供他们自己的接口实现。通过这种方式,你是在“订阅”而不是“禁止”。(是的,我确实编造了一个词。)
一般而言(除了许多关于您希望保留哪些功能以备将来修改的例外情况),最佳实践是使用最通用的参数来实现函数。这为函数的使用者提供了最大的灵活性。
因此,如果您决意要对此函数使用列表(可能是因为您希望在以后使用诸如Count或索引运算符之类的属性),出于上述原因,我强烈建议您考虑使用IList<Term>而不是List<Term>。
发布于 2011-12-13 20:43:14
List实现了IEnumerable,使用它将使事情变得更加灵活。如果一个实例出现在您不想使用List的地方,并且希望使用不同的集合对象,那么它可以很容易地从IEnumerable中转换出来。
例如,IEnumerable允许您使用Arrays和许多其他工具,而不是总是使用List。
Inumerable只是一个项目的集合,不同于List,您可以添加、删除、排序、用于每个项目、计数等。
https://stackoverflow.com/questions/8489375
复制相似问题