2009-08-05 5 views
90

여기에 프로젝트 실행 코드 분석을 실행하려고 (CA1002은 일반 목록을 노출하지 마십시오),이 같은 것을 경고의 수를 가지고 :C 번호 : 목록 <T>와 컬렉션 <T>의 차이

을 CA1002 : Microsoft.Design : 변경 '목록 < SomeType>' 'SomeClass.SomeProtectedOrPublicProperty'컬렉션, ReadOnlyCollection를 사용하거나 KeyedCollection

ㅁ에서 y List<T> 대신 Collection<T>을 사용해야합니까? 내가 msdn 문서를 볼 때, 그들은 거의 같다. 경고에 대한 오류 도움을 읽은 후, 나는 성능을 발휘하도록 설계 일반적인 수집 _is

System.Collections.Generic.List (T)에 따라서 가상 멤버를 포함하지 않는, 상속이 아닌 것을 발견했다.

하지만 이것은 실제로 무엇을 의미합니까? 그리고 내가 대신해야 할 일은 무엇입니까?

내부적으로 List<T>을 계속 사용해야하고 속성에서 new Collection<T>(someList)을 대신 반환해야합니까? 또는 List<T> 대신 Collection<T>을 사용하기 시작해야합니까?

+2

[이 블로그 게시물] (http://blogs.msdn.com/fxcop/archive/2006/04/27/585476)을 참조하십시오.aspx)에 대한 자세한 설명 –

+1

덧붙여 말하자면 Collection이 [System.Collections.ObjectModel에있는 이유를 알고 싶다면] (http://blogs.msdn.com/kcwalina/archive/2005/03/15/396086) .aspx)에 의해 Krzysztof Cwalina. –

답변

127

간략히 말하자면 일반 목록에는 추가, 제거 등의 가상 메서드가 없으므로 확장 성이 뛰어나지 않도록 설계되었습니다. 즉, 유용한 서브 클래스에 대해이 구체화 된 구현을 스왑 할 수 없다는 것을 의미합니다 (봉인되지 않았으므로 하위 클래스로 분류 할 수 있음).

따라서 List 자체를 노출하면 클래스의 공개 계약을 위반하지 않고 추가 또는 제거 작업 (예 :)을 추적하도록 컬렉션을 확장 할 수 없습니다.

컬렉션을 IList 또는 일부로 노출하면 실제 백킹 스토어로 계속 사용할 수 있지만 나중에 공개 계약을 변경하지 않고 나중에 구현 방식을 바꿀 수 있으므로 향후 확장 성을 유지할 수 있습니다. 수업.

+3

좋은 답변입니다! D – Svish

+5

참고로,'Collection '은'List '인스턴스를 내부적으로 사용합니다. –

20

Collection은 컬렉션을 변경하면 재정의하고 알림 이벤트와 같은 추가 기능을 제공 할 수있는 일부 가상 멤버 (삽입, 제거, 설정, 삭제)를 노출합니다.

지금은 필요하지 않지만 컬렉션이 포함 된 클래스에는 일반적인 요구 사항이므로 사전에 계획하는 것이 가장 좋습니다. Collection은 확장 성을 염두에두고 설계 되었기 때문에 매우 유연합니다. 장래에 컬렉션에 몇 가지 추가 기능이 필요하다고 결정하면 클래스의 공용 인터페이스를 변경하지 않고 확장 할 수 있습니다. 목록을 사용했다면 컬렉션을 목록으로 변경해야합니다. 즉, 목록을 사용하도록 변경해야하기 때문에 클래스의 모든 발신자를 손상시킬 수 있습니다.

List은 성능을 염두에두고 설계되었으므로 성능이 매우 중요한 특수한 경우에만 사용해야합니다. 미래의 목록을 사용하는 것에 대한 확장 성은 확장 성이 없으므로 목록에 의존하는 다른 모든 것을 깨뜨릴 것입니다. 일반적으로 List은 매우 낮은 수준의 수업 내에서만 내부적으로 사용해야하며 향후 변경 사항이 변경 될 가능성을 줄이려면 어떤 조치도 취하지 않아야합니다.

관련 문제