1

ICollection(T)接口的 Add-method已由LinkedList(T)-类显式实现。这个集合反而有 AddFirst- 和 AddLast- 方法(等等)。显式实现的方法映射到 AddLast 方法。这有一些缺点,恕我直言,根本没有好处。两个主要缺点是:

  1. 您不能在 LinkedList(T) 上使用集合初始化,因为它需要添加方法。
  2. 如果您在方法中使用了一个 List(T) 并希望将其更改为使用 LinkedList(T) ,则必须将所有对 Add 的调用更新为调用 AddLast 。

我的想法是,你永远不应该显式地实现接口成员,除非当你知道具体类型时它们根本没有意义。例如,如果您正在实施只读 ICollection(T),则应显式实施(并有效隐藏) Add-method。

是否还有其他不应该在框架中明确实现的方法示例?

附带说明:要解决第二个问题,您可以为 LinkedList(T) 类创建一个扩展方法“Add”。

4

1 回答 1

4

Add方法会模棱两可,因此我对显式实现感到满意...

Queue[<T>]Stack[<T>]有类似的行为。

对于其他(非收藏)好奇的显式成员 -DbParameter.PrecisionDbParameter.Scale.

重新在两者之间转移问题 - 你总是可以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 回答