2009-10-27 4 views
5

나는 비즈니스 객체에 Product라는 클래스가 있고 다른 클래스에는이 클래스의 객체 목록을 반환하고 싶습니다. 어떤 접근 방법을 사용해야합니까?C# Generics : List <Object> 또는 새 클래스 extends List <Object>

public static List<Product> GetProductList() { .... } 

또는 다음과 같이 List <Products>를 확장 제품 목록라는 내 비즈니스 오브젝트 namspace에서 다른 클래스 생성 :

public class ProductList :List<Products > { .... } 

을이 두 사이에 어떤 차이가 있습니까

public static ProductList GetProductList() { .... } 

이 그것을 사용? 얼마나 abt 메모리 할당 및 성능?

답변

9

추가 유형 (ProductList)을 사용하는 데 약간의 오버 헤드가 있지만 큰 것은 없습니다. 그러나 은 실제로 당신이하고 싶은 것에 따라에 달려 있습니다. 많은 경우에 ProductList은 공개 API에 List<T>을 태우고 List<T>은 매우 확장 가능하지 않기 때문에 여전히 좋은 생각이 아닙니다 (예 : virtual은 없습니다). Collection<T>에는 더 많은 확장 옵션이있을 수 있습니다.

public static IList<Product> GetProductList() {...} // abstraction; can return 
                // List<Product> if we want 

나 : 내가 추상화 또는 캡슐에 찬성 주장 것

public class ProductList : IList<Product> {...} // encapsulation, but need to 
               // add a lot of dull code 

은 C#을 내가 생각하고 (캡슐화 방법은 간단하게하지 않는 수치이다 "mixins").

또 다른 트릭 (경우에 따라 적절하지 않을 수도 있음)은 IList<Product>에 추가 방법의 환상을 추가하는 확장 방법을 사용하는 것입니다 ... 이는 까다로운 토론이므로 " 이 작업을 수행".

+0

공공 정적 IList의 GetProductList() {...} 방법이지만, 공공 정적 제품 목록 무엇을 않습니다 IList의 {...} 의미? – Max

+1

그것은 복사/붙여 넣기 버그가 있음을 의미합니다 .-p –

+0

아, 알았습니다. 이미 알고있는 C# 언어 구조가 더 많이 있다는 것을 이미 두려워했습니다. ;) – Max

7

제네릭의 목적은 무엇보다도 코드 재사용을 촉진하는 것이 었습니다. 귀하의 첫 번째 접근 방식이 적절하지 않습니다.

두 번째 방법을 사용한 유일한 경우는 IDisposable과 같은 인터페이스 구현을 추가하거나 추가 기능을 추가하거나 컬렉션을 xaml로 serialize해야 할 때였습니다.

0

할당 된 메모리 양은 동일해야하지만 두 번째 옵션은 반환 된 제품 목록에 사용자 지정 메서드를 추가 할 수 있으므로 더 유연합니다.

캡슐화 (또는 추상화, Marc 덕분에) IList<Product>을 반환하거나 IList<Product>을 구현하는 것이 가장 좋습니다.

5

더 편리한 조회 방법이나 제품 별 검색어와 같은 기능을 목록에 추가하려는 경우 자신의 ProductList 클래스를 반환하십시오.

그렇지 않다면, 자신의 수업으로 포장 할 필요가 없습니다. 대신 IList<Product> 또는 IEnumerable<Product>을 반환해야합니다. 더 일반적인 것이 좋습니다. 이렇게하면 목록이나 제품 모음을 반환 하겠지만 실제로 컬렉션 구현 (링크 된 목록, 배열 등)에는 연결되지 않습니다.개인적으로 나는 단순히 첫 번째 제안에 갈 것

public static IEnumerable<Product> GetProductList() 
2

왜냐하면 당신이 새로운 수업을 만들지 않는다는 것을 의미하기 때문입니다. 하나의 제네릭 클래스로 충분할 때 특수 목적 클래스가로드되는 것을 방지하므로이 방법을 사용합니다.

public static IList<Product> GetProductList() { .... }

0

: 당신은 단지 제품의 순서를 반환하고 싶은 목록에있는 모든 기능을 사용하지 않을 것입니다 경우에, 나는 당신이 뭔가를 사용하는 것이 좋을 것

2

마이크로 소프트 코드 분석은 수집 < T>보다는 목록 < T>에서 파생하는 것이 좋습니다.

This blog post은 이유를 설명합니다.

당신은 다음과 같은 이유로 컬렉션 < T>에서 자신의 컬렉션 클래스를 파생 수 있습니다

  • 에 대해 ComVisible 강력한 형식의 컬렉션 클래스를 노출하려면 추가 사용자 정의 기능

  • 을 추가하려면.