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

Ale*_*lec 0 .net c# generics

我正在写一个门面IList<T>来实现变更跟踪.是否Clear使用RemoveAtRemove或别的东西完全?我需要知道是否需要设置内部的所有项目跟踪状态,Clear或者仅在更改跟踪状态时Remove,并且RemoveAt就足够了.

同样,确实Add使用Insert?难道RemoveRemoveAt利用对方?

对此类实现的任何其他输入也是受欢迎的.

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

jas*_*son 6

是否Clear使用RemoveAtRemove或别的东西完全?

你不能依赖于IList.Clear使用IList.RemoveAt或实现IList.Remove.具体实现取决于它想做什么.

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

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

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

同样,Add使用Insert吗?

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

难道RemoveRemoveAt利用对方?

你不能依赖它是真的.

  • 你们彼此说话了.通过类型系统,接口*执行*的合同的哪些部分与接口的哪些部分*仅通过约定*表示*之间存在差异.IDisposable*强制*一次性对象具有一个名为Dispose的返回void的方法.IDisposable*表示*合约"当你完成这个对象时,你将尽快调用这个方法". (3认同)
  • @Jason:也许你对"合同"这个词的定义与我们其他人不同.对我而言,合同是一项协议 - 包含双方同意的条款和条件的文件.可能是文档说"通过声称你实现`IList <T>`你同意调用`Clear`方法将删除容器中的所有项目"或者它可以说"通过接受这个房子,你同意给我$ 1000000" .在任何情况下,您都不能认为协议的两端都将得到维护! (2认同)
  • 我从未谈过法律合同.我在谈论编程合同.大多数合同都采用文件的形式.您可以依赖所记录的内容,除非记录在案,否则您无法依赖当前版本的实现.我所看到的开发者博客上所读到的一切似乎都赞同这种观点,特别是旧观点,Larry Osteman的博客http://blogs.msdn.com/b/larryosterman/archive/2007/01/12/software-contracts -part-3-documentation.aspx ...你能举出一个有信誉的消息来源,说明文件不构成合同吗? (2认同)