使用"清除"方法与新对象

Dai*_*oto 34 .net c#

在.NET框架中,许多System.Collection类都有Clear方法.使用此方法与使用新对象替换引用有明显的优势吗?

谢谢.

Bri*_*ndy 41

你想使用Clear,如果你有对同一个对象的其他引用,并希望让他们都指向同一个对象.

例如,您可能有一个工作队列,您可以在其中存储要执行的任务.在一个或多个线程中,您将工作项从此队列中取出(当然,您使用锁定以确保一次最多一个线程访问队列).如果在某些时候你想要清空队列,那么你可以使用Clear并且所有线程仍将指向同一个对象.

如此处所示,当您使用Clear所有项目时将被删除,并且Count将为0,但Capacity将保持不变.通常,Capacity保持不变是一件好事(为了提高效率),但可能存在一些极端情况,即您拥有大量物品并希望最终释放内存.

上面的MSDN链接还提到Clear是O(n)操作.而简单地替换引用将是O(1)操作,然后最终它将被垃圾收集,但可能不会立即.但是替换引用也意味着需要重新分配构成容量的内存.

  • 这得到了大部分,我想要添加的唯一一件事就是你想在处理已经被观看的ObservableCollections时使用Clear. (3认同)

And*_*are 6

Brian是正确的,但更具体地说,该Clear方法从集合的当前实例中删除所有项目.实例化一个新集合并将其引用分配给您的变量将完全为您提供一个全新的实例,并且可能会导致一些意外后果,具体取决于其他人是否持有对旧实例的引用.如果另一个线程具有对该集合的引用,即使您已创建新实例,它们仍将保留对旧集合的引用.