【问题标题】:Should I worry about releasing resources in this case?在这种情况下我应该担心释放资源吗?
【发布时间】:2009-07-17 13:51:07
【问题描述】:

假设我有一个包含项目列表的类 Collection。

public class Collection
{
    private List<Item> MyList;
    //...
}

我有几个这个 Collection 类的实例,它们都有不同的 MyLists 但共享一些项目。 例如:有 10 个 Item,Collection1 引用 Items 1-4,Collection2 有 Items 2-8,Collection3 有 4,7,8 和 10 在其 List 上。

我实现如下:我有一个全局列表,其中包含任何可用的项目。在创建新集合之前,我会检查此列表中是否已经存在我需要的项目 - 如果没有,我会创建项目并将其添加到全局列表(当然也添加到集合中)。

我看到的问题是这些项目永远不会被释放——即使所有集合都消失了,它们消耗的内存仍然没有被释放,因为全局列表仍然引用它们。 这是我需要担心的事情吗?如果是这样,我该怎么办?我想在全局列表中添加一个计数器,以查看何时不再需要某个 Item 并删除它的引用。

编辑: 我认为这实际上是一个设计问题。我将放弃全局列表的想法,而是遍历所有 Collections 并查看它们是否已经拥有所需的 Item。

【问题讨论】:

    标签: c# dispose


    【解决方案1】:

    如果全局列表 需要 引用项目,那么您实际上无法释放它们。你真的需要引用全局列表中的项目吗?您应该在逻辑上何时能够从全局列表中删除项目?

    您可以考虑在全局列表中使用weak references,如果已收集到WeakReference 值本身,则它们的引用对象已被收集。

    【讨论】:

    • 感谢您提到弱引用 - 我不知道它们。但我认为它们与我的问题无关。
    【解决方案2】:

    看起来有点设计问题,你真的需要全局列表吗?

    除了 Jon 提到的弱引用之外,您还可以定期重建全局列表(例如在删除集合之后)或仅在需要时动态构建它并再次释放它。

    您必须决定哪种方法最合适,我们这里没有足够的上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 2011-01-17
      • 2022-07-22
      • 2011-05-24
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多