2013-07-03 52 views
3

ReSharper的被暗示我在下面的代码行改变IDictionary<string, string>差分<KeyValuePair>

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

IEnumerable<KeyValuePair<string, string>>

我不明白使用IEnumerable<KeyValuePair<string, string>>优于IDictionary的好处。

+6

Resharper建议你这样做,因为IEnumerable >与IDictionary 相比限制性更小,因为'createCookie中没有使用任何'IDictionary <,>''的具体方法'。这只是一个建议。 –

+1

@SimonBelanger +1“这只是一个建议” –

+2

@ blfemi3你可能会发现,在你实现代码后,这个建议将会消失。 –

回答

5

Resharper注意到你没有在你的代码中做任何特定于字典的东西,所以它建议允许更多的通用对象被接受。您在代码中所做的所有事情,您也可以使用IEnumerable<KeyValuePair<string, string>>

1

在这种特殊情况下没有太多优势。

但是,一般情况下,最好使用最常用的参数类型,因为它增加了可调用该方法的方法数量。

因此对于您的功能,您可以通过任何实施IEnumerable<KeyValuePair<string, string>>,其中包括IDictionary<string, string>加上潜在的许多其他类型。

Resharper不知道它是否真的有用,所以它总是警告你。

0

resharper可能是错的。你现在没有使用任何IDictionary的特定成员,但你最终可能会在将来添加它们。如果这个方法应该总是在字典上工作,那么你最好在公共接口中定义它。这样,如果您最终在将来更改实现以使用特定于字典的方法,则不会导致任何问题。 Resharper只看到你现在写的内容,而不是你将来写的内容。

+0

只要有可能,您都希望自己的方法能够返回不可变集合。 – Marco

1

Resharper建议在可能的时候使用方法参数的基类/接口。

它与OOP的依存倒转原理有关:https://en.wikipedia.org/wiki/Dependency_inversion_principle

从理论上来说可能有一些实现IEnumerable < KeyValuePair <字符串,字符串> >但不执行的IDictionary <字符串,字符串>一些类。 如果您使用IEnumerable < KeyValuePair <字符串,字符串> >您的方法将更通用,因为它将能够使用更大的对象集合。