【问题标题】:Collect garbage manually?手动收集垃圾?
【发布时间】:2014-04-21 19:35:14
【问题描述】:
Person p = new Person("Bob", 10);
p = new Person("James", 20);

原来我丢失了对包含“Bob”的实例的引用。如果我不想依赖 c# 的 GC,我该如何在重新分配 p 指向 James 之前亲自删除这个实例?只是为了避免额外的垃圾。

【问题讨论】:

  • 不要这样编码并在失去引用之前处置对象。
  • 大多数键盘上都有特殊的“DEL”按钮 - 只需从源代码中删除额外的创建 :)...
  • 如果你不想依赖 GC,唯一的选择就是选择 C# 以外的东西。虽然这个问题更多地是对对象生命周期的误解或不正确的期望。
  • “在重新分配之前”,p 包含对对象的引用...您希望 p 引用非对象吗?如果你想要“未定义的行为”和程序崩溃,你应该尝试使用 C/C++。
  • 我对 Bob 执行了一些操作,然后我需要处理掉它并对 jams 执行一些操作。显然,这是一个非常简化的示例,我不能“删除”这两行,因为它们是必要的。 @AlexeiLevenkov。

标签: c# manual garbage


【解决方案1】:

你不能。只能要求 GC 执行收集,但没有办法说它实际上会取走你的对象(也不能要求 GC 只收集一个对象)。

GC.Collect Method

强制立即对所有代进行垃圾回收。

除非你有非常好的理由(看起来你没有),否则你不应该这样做。

【讨论】:

  • 这很奇怪:/我确实有一个堆内存地址的引用。在将指针 p 重新指向另一个实例之前,我应该能够清除它。
  • 不,您没有对内存地址的引用。你有一个对象的引用。它与 C/C++ 中的指针并不完全相同(但这是一个需要更长时间讨论的话题)。你甚至不应该费心去想那个。这就是垃圾收集的美妙之处。这就是 .NET Framework 的工作方式。如果您需要/想要做类似的事情,请使用 C++ 或 C。
  • +1。 @NoobCoder - 我认为你想用 C++ 而不是 C# 编写代码 - 在更适应的环境中,你会以这种方式获得手动内存管理的所有优点和缺点。 GC 运行时通常没有办法进行手动清理,尤其是对于单个对象(.Net、Java、JavaScript....)
【解决方案2】:

您可以重复使用该实例,而不是替换它:

Person p = new Person("Bob", 10);

p.Name = "James";
p.Number = 20;

这样,您就不会失去对 Bob 实例的引用。

但是,为了代码的可读性和避免潜在的错误,您不应以这种方式重用变量。

【讨论】:

  • 这是我没有想到的。重复使用应该可以,谢谢!
【解决方案3】:

可以通过调用 Collect 来强制进行垃圾回收,但大多数情况下应该避免这样做,因为它可能会产生性能问题。

取自这里:http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多