2013-07-03 2 views
3

ReSharper에서 I는 다음 코드 라인 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

이 특별한 경우에는별로 이점이 없습니다.

그러나 일반적으로 가능한 가장 일반적인 매개 변수 유형을 사용하는 것이 좋습니다. 메서드 호출 수를 늘리기 때문입니다.

그래서 당신의 기능을 위해, 당신은 너무 IDictionary<string, string> 플러스 잠재적으로 많은 다른 유형이 포함 IEnumerable<KeyValuePair<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 < 문자열을 사용하는 경우 문자열 > >이 더 큰 개체 집합과 함께 작동 할 수 있기 때문에 더 보편적입니다.