通用列表方法Clear()是否使用RemoveAt()方法?

时间:2011-07-15 18:52:04

标签: c# .net generics

我正在为IList<T>编写一个外观来实现更改跟踪。 Clear完全使用RemoveAtRemove或其他内容吗?我需要知道是否需要在Clear内设置所有项跟踪状态,或者仅在Remove中更改跟踪状态,RemoveAt就足够了。

同样,Add使用Insert吗? RemoveRemoveAt互相使用吗?

欢迎对此类实现提出任何其他意见。

编辑:List的扩展方法是使用预先存在的方法还是新代码?我不知道是否需要实施这些。

4 个答案:

答案 0 :(得分:6)

  

Clear是否完全使用RemoveAtRemove或其他内容?

您不能依赖IList.Clear的实施来使用IList.RemoveAtIList.Remove。具体实现取决于它想做什么。

请注意,您甚至无法真正依赖Clear实际删除实例中的所有项目。接口不强制执行行为,它实际上不是合同。

对接口究竟是什么有一个很大的误解。你会听到人们说“接口是合同”。他们不是。它们只是指定某些方法具有某些签名和返回类型,如果您有一个实现给定接口的对象,您将能够调用它们。而已。 无法保证实施或行为。

此外,依赖于实现细节是一种巨大的代码味道。他们可能随时改变你,而你却不知道导致你的代码失败并且悲惨地死去。 不要依赖实施细节。

  

同样,Add使用Insert吗?

同样,您不能依赖IList.Add使用IList.Insert

  

RemoveRemoveAt互相使用吗?

你不能依赖它是真的。

答案 1 :(得分:3)

如果您编写外观并不重要,因为这些方法不是虚拟的。事件如果执行Clear调用Remove(它没有)它将不是你的覆盖删除。

这样可以让您的生活更轻松。您可以在包装器中完全实现此跟踪。

答案 2 :(得分:2)

IList只是一份合同。在幕后实现IList的一个类是它自己的业务,它不需要做出任何承诺。一些实现者可能会遍历他们的项目并针对他们调用Remove,而其他实现者可能只是删除他们的后备存储并创建一个新的或许多其他可能性。

假设有人实现接口以某种方式实现它可能不是一个好主意。在某些时候,这肯定会以意想不到的方式打破。

答案 3 :(得分:2)

从来源,List<T>使用Array.Clear()

// Clears the contents of List.
public void Clear() { 
    if (_size > 0) 
    {
        Array.Clear(_items, 0, _size); // Don't need to doc this but we clear the elements so that the gc can reclaim the references. 
        _size = 0;
    }
    _version++;
}