C#: List 와 Collection (CA1002, 일반 목록을 노출하지 않음) [복제]의 차이

StackOverflow https://stackoverflow.com/questions/1232108

  •  22-07-2019
  •  | 
  •  

문제

이 질문은 이미 여기에 답이 있습니다.

여기에서 프로젝트에서 코드 분석을 실행하려고 시도했으며 다음과 같은 말을하는 많은 경고를 받았습니다.

CA1002 : Microsoft.Design : Change 'List어느 쪽이든> 'in'someclass.someprotectedorpublicproperty'수집, readonycollection 또는 keyedcollection을 사용합니다

왜 내가 사용해야 하는가 Collection<T> 대신에 List<T>? MSDN 문서를 볼 때 거의 평등 해 보입니다. 경고에 대한 오류 도움말을 읽은 후

System.collections.generic.list (t) _ _ _ exection은 상속이 아닌 성능을 위해 설계된 일반 컬렉션이므로 가상 멤버가 포함되어 있지 않습니다.

그러나 이것이 실제로 무엇을 의미합니까? 그리고 대신 무엇을해야합니까?

계속 사용해야할까요? List<T> 내부적으로, 그리고 속성에서 a new Collection<T>(someList) 대신에? 아니면 그냥 사용하기 시작해야합니다 Collection<T> 대신에 List<T>?

도움이 되었습니까?

해결책

요컨대, 일반 목록에는 확장 할 수없는 빠르고 빠르게 설계되었으므로 추가, 제거 등을위한 가상 방법이 없습니다. 이것은 유용한 서브 클래스를 위해이 콘크리트 구현을 교체 할 수 없음을 의미합니다 (밀봉되지 않았으므로 서브 클래스를 할 수 있지만).

따라서 목록 자체를 노출시킴으로써 수집을 확장하여 클래스의 공개 계약을 중단하지 않고도 추가 또는 작업을 추적하거나 제거 할 수 없습니다.

컬렉션을 ILIST 또는 약간의 소문으로 노출 시켜서 목록을 실제 백킹 스토어로 사용할 수 있지만, 클래스의 공개 계약을 변경하지 않고 나중에 Concerete 구현을 교체 할 수 있으므로 미래의 확장 성을 유지합니다.

다른 팁

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

지금은 이것을 필요로하지 않을 수도 있지만 컬렉션이 포함 된 클래스의 일반적인 요구 사항이므로 미리 계획하는 것이 가장 좋습니다. 왜냐하면 Collection 확장 성을 염두에두고 설계되었습니다. 미래에 컬렉션에 추가 기능이 필요하다고 결정하면 클래스의 공개 인터페이스로 변경하지 않고도 확장 할 수 있습니다. 목록을 사용했다면, 당신은 그것을 컬렉션으로 변경해야했을 것입니다. 즉, 클래스의 모든 발신자가 목록을 사용하도록 변경해야하기 때문에 클래스의 모든 발신자를 깨뜨 렸을 것입니다.

List 반면에 성능을 염두에두고 설계되었으므로 성능이 매우 중요한 특정 경우에만 사용해야합니다. 목록을 사용하여 어떤 미래의 변화가 확장되지 않기 때문에, 목록에 의존하는 다른 모든 것을 깨뜨릴 수 있습니다. 보통 List 매우 낮은 수준의 클래스 내에서만 내부적으로 사용되며 향후 변화의 가능성을 줄이기 위해 아무것도 노출되지 않아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top