2012-10-31 4 views
18

사용자 지정 GenericCollection 클래스를 디자인해야합니다. 이제는 IEnumerable, ICollectionIList을 사용하여 파생 할 수있는 옵션이 많습니다. 나중에 추가 기능이 제공됩니다.IEnumerable 대 ILolist를 사용한 ICollection

나는이 경우 _list처럼 컬렉션을 실제로 보유하도록 객체를 선언해야 할 수도 있다는 점을 다소 혼란스럽게 생각합니다. 내가 ICollection<T> 또는 IList<T> 갈 경우는 암시 적으로 사용할 수있게되면

public class GenericCollection<T> : IEnumerable<T> 
{ 
    private List<T> _list; 
    //... 
} 

는하지만, 나는 List 객체를 선언 할 필요가 없습니다.

public class GenericCollection<T> : IList<T> 
{ 
    // no need for List object 
    //private List<T> _list; 
    //... 
} 

성능에 대한이 두 가지 방법의 차이점은 무엇입니까?

각 시나리오에서 특히 자신의 컬렉션을 디자인 할 때 선호됩니다. 나는 좋은 성능으로 경량 컬렉션에 관심이 있습니다. 나는 이것이 IEnumerable<T>을 사용하여 성취 될 수 있다고 생각하지만, 그와 함께 할 강력한 이유들과 정확히 어떻게 일치 하는가?

일부 기존 게시물을 검토했지만 필요한 정보가 없습니다.

Returning 'IList' vs 'ICollection' vs 'Collection'

+0

첫 번째 예에서는 _list 멤버가 필요하지 않습니다. 또한, IList에서 상속 한 경우 IList와 관련하여 공용 인터페이스를 구현하는 경우에도 일부 저장 메커니즘을 구현해야합니다. –

답변

37

IEnumerable, ICollectionIList은 (일반적으로, I 프리픽스 모든 유형) 막 interfaces이다. 그들은 당신이 당신의 클래스가 무엇을 할 것인가를 드러내지 만, 만약 당신이 inherit 클래스와는 달리, 인터페이스는 당신이해야한다고 말하는 것들의 기본 구현을 제공하지 않습니다.

는 지금까지 인터페이스, 여기에 빠른 가이드가 선택한 같이

  • IList은 인덱스로 액세스 할 수있는 ICollection입니다.
  • ICollectionIEnumerable이며 Add, RemoveCount과 같은 항목에 쉽게 액세스 할 수 있습니다.
  • IEnumerable은 열거 할 수있는 모든 항목으로, 열거 할 때까지 해당 항목의 목록이 존재하지 않는 경우에도 마찬가지입니다. 확장 할 (또는 대부분의 논리 실행 개인 필드로 유지), List<T>, Collection<T>, (하지만 구현을 오버라이드 (override)에보다 쉽게 ​​액세스 할 수있는 IList<T>를 구현하는 참조하는 컬렉션에 대한을 할 수

일부 클래스 Collection<T> versus List<T> what should you use on your interfaces?)과 큰 차이점 인 ObservableCollection<T> 또는 목록이 아닌 모음 (예 : Dictionary<T, U>HashSet<T>)이 있습니다. 이 중 하나에 대한 자세한 내용은 해당 클래스의 MSDN 설명서를 참조하십시오.

0

성능은 인터페이스가 구현되는 의존하기 어렵다. 오히려 프로세서가 특정 목표를 달성하기 위해 얼마나 많은 명령어를 실행해야하는지에 달려 있습니다. IEnumerable을 구현하고 List를 감싸는 경우, 목록에 호출을 전파하는 Add/Remove/this [] 메서드가 작성되어 결국 성능 오버 헤드가 추가됩니다. 따라서 측정을하지는 않았지만 상속 접근법은 조금 더 빠를 것입니다.

그러나 이러한 세부 정보는 가능한 모든 CPU주기를 저장해야하는 극한 상황의 실시간 응용 프로그램에만 중요합니다. 에릭 리 퍼트 (Eric Lippert)는 그런 세부 사항에주의를 기울이는 훌륭한 기사를 가지고 있습니다 : http://blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx. 일반적으로, 성능 세부 사항보다는 비즈니스 로직 및 애플리케이션 아키텍처에 더 잘 맞는 접근 방식을 사용하는 것이 좋습니다.

1

먼저이 인터페이스를 선택하지 않아도됩니다. 필요한 경우 세 가지를 모두 구현할 수 있습니다. 둘째, IEnumerable을 구현할 때 기본 목록을 공개 할 필요가 없습니다. 기본 목록의 열거자를 사용하는 메서드 만 구현할 수 있습니다.

성능면에서 보면, 필자는 기능면에서 필요한 부분에 중점을두고 많은 영향을 줄 것으로 생각합니다. 확실히 알 수있는 유일한 방법은 측정하는 것입니다.

+0

나는 가리키는 것에 대해 공용 목록을 실수로 추가했습니다. 세 가지 인터페이스를 모두 구현하는 용도는 무엇입니까? 그리고 만약 내가 혼자 기능에 초점을 맞춘다면 List을 추가하여 기능을 제공 할 준비가되었습니다. 그러나 나는 IEnumerable 에 대한 몇 가지 강력한 이유를 찾고 있는데요? –

+0

IList를 구현하는 경우 IEnumerable을 구현하므로 IList를 구현하면 명시 적으로 구현할 필요가 없습니다. 나는 그저/또는 질문이 아니라고 말하려고했다. – Rik