2009-10-27 15 views
5

私はビジネスオブジェクト内にProductというクラスを持っていますが、別のクラスではこのクラスのオブジェクトのリストを返したいと思います。C#Generics:リスト<Object>または新しいクラスextendsリスト<Object>

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

または次のようにList <Products>を拡張ProductListと呼ばれる私のビジネス・オブジェクトnamspaceで別のクラスを作成します。

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

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

そこ

をそれを使用するこれら二つの間に違いはありますか?どのくらいのメモリ割り当てとパフォーマンスですか?

答えて

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#は、私が考えている(カプセル化アプローチを簡単にしないことは残念です"ミックスイン")。

​​に拡張メソッドを使用してエクステンションメソッドを追加する方法があります。これは難しい議論ですので、これを行う"。

+0

のpublic staticのIList GetProductList(){...}の方法であるが、公共の静的ProductList何を行いますのIList {...}を意味? – Max

+1

私はコピー/ペーストのバグを持っていることを意味します;-p –

+0

ああ、まあ、私はすでに知っていないC#でより多くの言語構造があることを恐れていました。 ;) – Max

7

ジェネリックの目的は、とりわけ、コードの再利用を促進することでした。あなたの最初のアプローチはそれ以上のものです。

2番目の方法は、コレクションにインターフェイスの実装(IDisposableなど)を追加したり、余分な機能を追加したり、xamlにコレクションをシリアル化する必要があった唯一の方法です。

0

割り当てられるメモリの量は同じである必要がありますが、2番目のオプションは返された製品リストにカスタムメソッドを追加できるので柔軟性があります。

カプセル化(または抽象化、Thanks Marc)のために、​​を返すか、それぞれ​​を実装することをお勧めします。

5

より便利な検索方法や製品固有のクエリなどの機能をリストに追加する予定の場合は、ProductListクラスを返します。

もしそうでなければ、自分のクラスでラップする必要はありません。代わりに、​​またはIEnumerable<Product>を返す必要があります。これは、リストや製品のコレクションを返すアイデアを保持しますが、実際のコレクションの実装(リンクされたリスト、配列など)には結びつきません。個人的に私は単にあなたの最初の提案で行くだろう

public static IEnumerable<Product> GetProductList() 
2

あなたが新しいクラスを作成していないことを意味するからです。 1つのジェネリッククラスで十分であれば、特別な目的のクラスがたくさんあることを防ぐので、このようにします。

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

0

:あなただけの産物の配列を返すようにしたいとリスト上のすべての機能を利用することはない場合、私はあなたがのようなものを使用することをお勧めしたい

2

マイクロソフトコード分析は、コレクション< T>ではなく一覧< T>から派生することをお勧めします。

This blog postの理由を説明します。

次の理由のためにコレクション< T>から独自のコレクションクラスを派生されることがあります

  • はのComVisible、厳密に型指定されたコレクションクラスを公開するために、追加のカスタム機能

  • を追加します。

関連する問題