1

ICollection(T)インターフェイスの Add メソッドは、 LinkedList(T)クラスによって明示的に実装されています。このコレクションには、代わりに AddFirst メソッドと AddLast メソッドがあります (特に)。明示的に実装されたメソッドは、AddLast メソッドにマップされます。これにはいくつかの欠点があり、IMHO にはまったくメリットがありません。2つの主な欠点は次のとおりです。

  1. Add メソッドが必要なため、LinkedList(T) でコレクションの初期化を使用することはできません。
  2. メソッドで List(T) を使用していて、代わりに LinkedList(T) を使用するように変更したい場合は、代わりに AddLast を呼び出すように Add へのすべての呼び出しを更新する必要があります。

私が考える方法は、具象型を知っているときにまったく意味がない場合を除き、インターフェイス メンバーを明示的に実装するべきではないということです。たとえば、読み取り専用の ICollection(T) を実装している場合は、Add メソッドを明示的に実装する (そして効果的に非表示にする) 必要があります。

フレームワークに含めるべきではない、明示的に実装されたメソッドの他の例はありますか?

補足: 2 番目の問題を解決するには、LinkedList(T) クラスの拡張メソッド「Add」を作成します。

4

1 に答える 1

4

メソッドがあいまいになるので、Add明示的な実装に満足しています...

Queue[<T>]そしてStack[<T>]似たような行動をとります。

他の (非コレクション) 好奇心旺盛な明示的なメンバーについてはDbParameter.Precision、 とについてはどうですかDbParameter.Scale

2つの間で転送する問題について-いつでもToLinkedList<T>拡張メソッドを書くことができますIEnumerable<T>

あるいは、AddRange<T>拡張メソッドは大いに役立ちます...

static void Main()
{
    var list = new LinkedList<int>();
    list.AddRange(1, 2, 3, 4, 5);
}
static void AddRange<T>(this ICollection<T> list, params T[] values)
{
    foreach (T value in values)
    {
        list.Add(value);
    }
}

(編集)単一の式として使用できるようにする場合は、「流れるような」API を使用することもできます。

static void Main()
{
    var list = new LinkedList<int>().AddRange(1, 2, 3, 4, 5);
    // `list` is correctly a LinkedList<int> here
}
static TCollection AddRange<TCollection, TValue>(
    this TCollection collection, params TValue[] values)
    where TCollection : ICollection<TValue>
{
    foreach (TValue value in values)
    {
        collection.Add(value);
    }
    return collection;
}
于 2009-02-06T10:01:59.177 に答える