3

重複の可能性:
(Tの)リストと(Tの)コレクションの違いは何ですか?

リストコレクションを返す静的クラスとゲッターがあります。今、私は読んで、ListではなくICollectionを返すように言われました。publicstaticListよりもpublicstaticICollectionを使用する利点は何ですか?

static class Storage
{
    private static List<string> store;

    static Storage()
    {
        store = new List<string>();
    }

    public static ICollection<string> getList
    {
        get
        {
            return store.AsReadOnly();
        }
    }

    public static void addString(string add)
    {
        store.Add(add);
    }

    public static void removeString(string remove)
    {
        store.Remove(remove);
    }

    public static void display()
    {
        foreach (String view in store)
        {
            Console.WriteLine(view);
        }
    }
}

}

4

3 に答える 3

3
  • IEnumerable<T>T一連のオブジェクト上で前方のみのカーソルへのアクセスを提供します
  • ICollection<T>と同じIEnumerable<T>ですが、プロパティも提供しCountます(コレクションに決定的な終わりがあることを意味します)
  • IList<T>インデクサー( )ICollection<T>を介してリスト内の任意の要素と同じですがランダムアクセスを提供しますlist[5]

List<T>上記のすべてを実装します。

引数または戻り値としてより単純なインターフェースを使用する利点は、呼び出し元により柔軟性があり、オブジェクトがどのように使用されるか(または戻り値の場合に使用されることを意図)を文書化するのに役立つことです。

于 2012-09-03T03:30:05.127 に答える
2

それは良い習慣であり、より保守しやすいです。タイプの代わりにインターフェースを使用する場合、コードはそのタイプにハードコーディングされていません(List)。

例:後でクラスを変更してStorage、データを別のタイプのストレージ(つまり、データベース、XMLなど)に保持することにしたとします。EntityFrameworkを使用してデータベースに接続するか、LINQ-to-objectsを使用します。

実際には、IEnumerableまたはの使用を検討することをお勧めしますIEnumerable<string>。これらのタイプは、LINQおよび他のほとんどのタイプのコレクションで非常にうまく機能します。Storageしたがって、戻り値の型を変更したり、クラスを処理するすべてのコードを作り直したりせずに、LINQに移行できます。

そして、おそらくstring最良の選択ではありませんか?何を保管していますか?たぶん、あなたはあなたが保存しているオブジェクトのためのクラスを作成するべきです(すなわちName)。次に、を返しますIEnumerable<Name>

class Name
{
    public string Name { get; set; }
}

後で、クラスへのアクセスを追加したい場合がありFirstNameます。LastName

class Name
{
    public string Name
        get
        {
            return string.Format("{0} {1}", FirstName, LastName);
        }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

を使用IEnumerable<Name>することで、これを行うために消費するコードを変更する必要はありません。クラスの元のインターフェイスをサポートしている限り、Name何も壊すことなく追加機能を追加できます。

ここで、別の戻り型に移行する場合は、処理するすべてのコードをStorage新しい型にも移行することも検討する必要があります。List将来の変更をより困難にするため、コード内のあらゆる場所でストレージタイプを「ベイクイン」する場合。今はこれに感謝しないかもしれませんが、より優れたプログラマーになるか、将来の変更を行うことに気付くと、基になるタイプを変更できるインターフェイスを使用する利点がわかります。オブジェクトのタイプを選択し、最初のリビジョンでそれらに対応するときは、将来の可能性を予測するようにしてください。後で追加するときに頭痛の種を減らすことができます。

于 2012-09-03T03:10:39.330 に答える
0

オブジェクトを介してインターフェイスを返す理由を尋ねる場合、インターフェイスは、特定の実装を必要とするのではなく、オブジェクトの機能とその使用方法を説明します。これにより、コードがより一般的になります。

リストではなくコレクションを使用する理由を尋ねる場合、コレクションは順序を意味しませんが、リストは順序を意味します。専門用語は、コレクションは「弱い」ため、より多くの状況に適用されるということです。注文する必要がない場合は、コレクションを使用してください。それ以外の場合は、リストを使用してください。

于 2012-09-03T02:20:52.740 に答える