2009-05-28 5 views
6

과 같은 메서드가 포함되어 있지 않은 이유 FxCop과 개인적인 취향에 따라 ReadOnlyCollections를 최대한 사용하도록 코칭하겠습니다. 목록의 수신자가 자신의 콘텐츠를 수정할 수 없도록하는 경우. 그들의 이론에서 이것은 빵 & 버터입니다. 문제는 List <> 인터페이스가 모든 종류의 유용한 메소드를 훨씬 더 풍부하게 표현한다는 것입니다. 왜 그들은 그 선택을 했습니까?ReadOnlyCollection <>에 FindAll(), FindFirst(),

쓰기 가능한 컬렉션을 포기하고 반환합니까? 읽기 전용 컬렉션을 반환 한 다음 쓰기 가능한 다양한 스타일로 다시 묶으시겠습니까? 아.


업데이트 : 덕분에 내가 팀을 시행합니다 FxCop를 사용하는 이유는 프레임 워크 디자인 가이드 라인 및 그게 잘 알고 있어요. 그러나이 팀은 VS 2005와 함께 살고 있습니다 (나는 알고 있습니다). 그래서 LINQ/Extension 메서드가 문제를 해결할 것이라고 말하면서 슬프게 만듭니다.

그들은 List.FindAll()과 .FindFirst()가 foreach 루프를 작성하는 것보다 더 명확하다는 것을 알았습니다. 이제 ReadOnlyCollections를 사용하여 선명도를 잃게됩니다.

어쩌면 내가 눈치 채지 못하는 깊은 디자인 문제가있을 수 있습니다.

- 죄송합니다. 원래 게시물은 VS2005 제한을 언급해야합니다. 나는 너무 오랫동안 함께 살았으므로주의를 기울이지 않았다.

답변

6

섹션 .NET Framework Design Guidelines Second Edition의 8.3.2 :

사용 ReadOnlyCollection<T>, ReadOnlyCollection<T>의 서브 클래스를 DO, 또는 속성에 대한 드문 경우 IEnumerable<T> 또는 읽기 전용 컬렉션을 나타내는 값을 반환합니다.

우리는 반환 된 컬렉션의 의도를 표현하기 위해 ReadOnlyCollections를 사용합니다.

귀하가 말하는 List<T> 방법이 편의를 위해 .NET 2.0에 추가되었습니다. C# 3.0/.NET 3.5에서는 확장 메서드를 사용하여 모든 메서드를 ReadOnlyCollection<T> (또는 임의의 IEnumerable<T>)으로 가져올 수 있으므로 LINQ 연산자도 사용하므로 다른 형식에 기본적으로 추가 할 동기가 있다고 생각하지 않습니다. . List에 존재한다는 사실은 확장 메서드가 현재 사용 가능하지만 2.0에 없었기 때문에 역사적인 참고 사항 일뿐입니다.

+2

슬프게도 팀은 2.0의 타임 워핑에 걸렸습니다. –

3

원래 추가되지 않은 이유에 대한 통찰력이 없습니다. 그러나 LINQ가 생겼으므로 향후 언어 버전에 추가 할 이유가 없습니다. 언급 한 메서드는 오늘 LINQ 쿼리로 쉽게 작성할 수 있습니다. 요즘 나는 거의 모든 것에 대해 LINQ 쿼리를 사용합니다. 실제로는 List<T>이 이러한 메서드를 가지고있어 화를내는 경향이 있습니다. 왜냐하면이 메서드는 IEnumerable<T>에 대해 작성하는 확장 메서드와 충돌하기 때문입니다.

+0

슬프게도 팀은 2.0의 타임 워핑에 걸렸습니다. –

+0

@ 마크, VS2008을 사용하여 C# 2.0 호환 코드를 컴파일 할 수 있습니까? 그렇다면 직접 이러한 확장 방법을 정의 할 수 있습니다. – JaredPar

+0

아직 2008 라이선스가 없다는 것은 문제가 아닙니다. 명백하게 2008 년을 움직일 계획은 잠시 동안 책에있었습니다. Nutss #! @ & * # –

7

우선 ReadOnlyCollection<T>IEnumerable<T>IList<T>을 구현합니다. .NET 3.5 및 LINQ의 모든 확장 메서드를 사용하면 원래 List<T> 클래스의 거의 모든 기능에 쿼리를 통해 액세스 할 수 있습니다. 즉, ReadOnlyCollection<T>과 함께해야합니다.

귀하의 초기 질문은 제가 몇 가지 제안을하기 위해 ...

돌아 오는 List<T>은 잘못된 디자인이므로 비교할 부분이 아니어야합니다. 구현에는 List<T>을 사용해야하지만 인터페이스의 경우 IList<T>을 반환해야합니다. Framework Design Guidelines 특히 상태 :

"는 공개 API에 NOT 사용 ArrayList 또는 List<T> 마십시오." (쪽 251)

당신이 이것을 고려한다면 ReadOnlyCollection<T>에 대한 단점은 List<T>과 비교했을 때 전혀 없습니다. 이 두 클래스는 모두 IEnumerable<T>IList<T>을 구현하며, 어쨌든 반환되어야하는 인터페이스입니다.

+0

슬프게도 팀은 2.0의 타임 워핑에 걸렸습니다. –

+0

@ Mark Levison : 2.0에서도 ILync 을 반환해야하며 목록 이 아니므로 주석이 계속 적용됩니다. –

0

제프의 답변에는 필요한 답변이 포함되어 있다고 생각합니다. ReadOnlyCollection<T> 대신에 VS2008/LINQ로 업그레이드하지 않고 사용할 메서드를 포함하도록 구현 한 하위 클래스를 반환하십시오.

관련 문제