1

重複の可能性:
なぜIListまたはListを使用するのですか?

私は次のものを持っています:

public class CityViewModel
{
    public CityViewModel() {     
        Details = Enumerable.Range(1,10).Select(x => new City.Detail()).ToList(); 
    }
    public string Topic { get; set; }
    public City City { get; set; }
    public IList<City.Detail> Details { get; set; }
}

詳細を作成する方法としての提案が私に与えられました。私が確信していないのは、次の行がIListとして宣言されている理由です。

public IList<City.Detail> Details { get; set; }

これを次のように宣言するのは、より正確ではないでしょうか。

public List<City.Detail> Details { get; set; }

誰かが私に違いを説明できますか?

4

5 に答える 5

2
 public IEnumerable<City.Detail> Details { get; private set; }

これはおそらく、クラスのインターフェースとして開始したいものです。必要最小限の機能を公開し、外部クラスがメンバーまたはコレクションを変更できないようにします。

必要な場合にのみ追加機能 (IList) を公開し、絶対に必要な場合にのみセッターを公開します。

于 2012-05-25T03:14:14.930 に答える
2

IList<T>インターフェースです。List<T>コンクリートタイプです。

内部実装についてユーザーにあまり伝えたくない場合 (通常、それは避けたいことです)、IList<T>- を使用する必要があります。その後、そのインターフェイスを実装するものに自由に切り替えることができるためです...ある種のアダプターまたはラッパー - またはテスト用のモック。

また、リスト スタイル オブジェクトを本当に返す必要があるかどうか、または使用IEnumerable<T>する方がニーズに適しているかどうかも検討します (そのリストを反復処理するだけの場合)。長さと直接のインデックス作成が必要な場合にのみリストが必要になると思います-それでも、からリストを作成するのIEnumerable<T>は簡単です。

于 2012-05-25T03:05:05.700 に答える
1

クラスではなくインターフェイスを使用することは、情報の隠蔽とテスト容易性の両方の理由から、間違いなく正しい方法です。さらに進んで、可能な場合はICollection<T>代わりに使用することをお勧めしIList<T>ます。これにより、代替実装を選択する限り、柔軟性がさらに高まり、ユーザーはほとんど同じ操作を実行できます。

さらに、おそらく自動割り当て可能なプロパティを使用しないでしょう。読み取り専用バージョンを返し、独自のクラスでリストを操作するための別のメソッドを提供します。

これが私がすることです:

public class CityViewModel {
    private readonly List<City.Detail> details;
    public CityViewModel() {
        // Here you assign a List to details
    }
    public ICollection<City.Detail> Details {
        get {
            return details.AsReadOnly();
        }
    }
}

これにより、リストの実装がユーザーから隠され、背後でリストを変更できなくなり、List. たとえば、HashSet後で a を使用することにした場合、クラスを使用するコードで何かを壊すことを恐れずに、それを交換することができます。

于 2012-05-25T03:12:31.170 に答える
1

との基本的な違いはIListListIList が List が Class である Interface であることです。したがって、リストを使用すると、検索やデータ操作を行うための組み込み関数が増えます。

リスト

IList

于 2012-05-25T03:15:03.173 に答える
1

これに関する私の見解は、IList を返すことで、メソッドの呼び出し元が基になる実装にとらわれないようにすることができるということです。つまり、メソッド内の実装を IList も実装する別のコレクションに変更する場合、呼び出し元を更新する必要はありません。一方、具体的な List を返す場合、基になるコレクション型に変更を加えると、すべての呼び出し元を更新する必要があります。

于 2012-05-25T03:04:12.713 に答える