我正在为IList<T>
编写一个外观来实现更改跟踪。 Clear
完全使用RemoveAt
或Remove
或其他内容吗?我需要知道是否需要在Clear
内设置所有项跟踪状态,或者仅在Remove
中更改跟踪状态,RemoveAt
就足够了。
同样,Add
使用Insert
吗? Remove
或RemoveAt
互相使用吗?
欢迎对此类实现提出任何其他意见。
编辑:List的扩展方法是使用预先存在的方法还是新代码?我不知道是否需要实施这些。
答案 0 :(得分:6)
Clear
是否完全使用RemoveAt
或Remove
或其他内容?
您不能依赖IList.Clear
的实施来使用IList.RemoveAt
或IList.Remove
。具体实现取决于它想做什么。
请注意,您甚至无法真正依赖Clear
实际删除实例中的所有项目。接口不强制执行行为,它实际上不是合同。
对接口究竟是什么有一个很大的误解。你会听到人们说“接口是合同”。他们不是。它们只是指定某些方法具有某些签名和返回类型,如果您有一个实现给定接口的对象,您将能够调用它们。而已。 无法保证实施或行为。
此外,依赖于实现细节是一种巨大的代码味道。他们可能随时改变你,而你却不知道导致你的代码失败并且悲惨地死去。 不要依赖实施细节。
同样,Add使用Insert吗?
同样,您不能依赖IList.Add
使用IList.Insert
。
Remove
或RemoveAt
互相使用吗?
你不能依赖它是真的。
答案 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++;
}