IDictionary和IEnumerable<KeyValuePair>的区别

4

Resharper建议我更改下面代码行中的IDictionary<string, string>

private static void createCookie(HttpCookie cookie, IDictionary<string, string> values)

转换为 IEnumerable<KeyValuePair<string, string>> 的优点我不太明白,相比之下使用 IDictionary 有什么好处呢?


6
Resharper 建议你这么做是因为在 createCookie 方法中,IEnumerable<KeyValuePair<string, string>>IDictionary<string, string> 更宽松,因为你没有使用任何 IDictionary<,> 特有的方法。这只是一个建议。 - Simon Belanger
1
@SimonBelanger +1 对于"这只是一个建议"表示赞同 - User 12345678
2
@blfemi3,你很可能会发现,在你实施这段代码之后,这个建议会消失。 - User 12345678
4个回答

7

Resharper注意到您的代码中没有涉及任何字典特定操作,因此建议也接受更通用的对象。您的代码中所做的一切都可以使用 IEnumerable<KeyValuePair<string, string>> 实现。


1
在这种特定情况下没有太多优势。然而,一般来说,最好使用最通用的参数类型,因为这样可以增加调用该方法的方式数量。因此,对于您的函数,您可以传递任何实现了“IEnumerable>”接口的内容,其中包括“IDictionary”以及可能还有许多其他类型。Resharper不知道它是否真的有用,所以它总是会警告您。

1

Resharper建议尽可能在方法参数中使用基类/接口。

这与面向对象编程的依赖倒置原则有关: https://en.wikipedia.org/wiki/Dependency_inversion_principle

从理论上讲,可能存在一些实现IEnumerable<KeyValuePair<string, string>>但不实现IDictionary<string, string>的类。 如果您使用IEnumerable<KeyValuePair<string, string>>,那么您的方法将更加通用,因为它将能够处理更大的对象集。


0

Resharper可能是错误的。您现在没有使用IDictionary的任何特定成员,但将来可能会添加它们。如果此方法应始终在字典上工作,则最好在公共接口中定义该方法。这样,如果您将来更改实现以使用字典特定方法,则不会引起任何问题。 Resharper只看到您现在编写的内容,而不是您期望将来编写的内容。


无论如何,您希望您的方法始终返回不可变集合。 - MeTitus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接