【问题标题】:Zombie objects in c# and .net what they are and how to avoid them [duplicate]c#和.net中的僵尸对象它们是什么以及如何避免它们[重复]
【发布时间】:2023-03-12 03:05:01
【问题描述】:

最近我有一个关于 C# 中 Zombie Objects 的采访的问题。您能否通过一个简单的示例向我解释它们是什么?

那次采访中的僵尸对象与有关 Win-forms 的应用程序有关,我们可以在 asp.net MVC 中获取这些对象吗?

感谢您花时间解释,因为我搜索了它,但我没有找到我可以理解的示例或解释

【问题讨论】:

  • 我猜他们指的是事件处理程序内存泄漏问题?
  • 如果您可以在 .net 中获取僵尸对象,那么您可以在任何 .Net 应用程序、表单、asp、wpf 等任何地方获取它们。因为它们与框架有关,而不是特定的语言
  • 僵尸是不死生物,它们打算吃掉人们的大脑(和植物)。你可以通过在你的花园/后院放一堆豌豆射击植物来消除你的僵尸问题。
  • 相关:Do zombies exist...in.NET? 这有一些关于 .NET 中的僵尸 线程、导致它们的原因以及如何避免它们的极好的信息。但是它没有提到僵尸objects。你确定面试题是这么说的吗?

标签: c# asp.net .net asp.net-mvc winforms


【解决方案1】:

事件导致的僵尸情况是这样的:

class AnObjectThatWillSoonGoOutOfScope{
  public AnObjectThatWillSoonGoOutOfScope(ISomeLongLivedService service){
    service.SomeEvent += OnSomeEvent;
  }
  private void OnSomeEvent(...){...}
}

长期服务会保留对应该在超出范围之前取消订阅事件的子对象的引用。您可以使用 dispose 模式来避免这种情况。您可以使用 Ants Memory Profiler 之类的工具来跟踪这些情况。通常,如果您在自己的实例上订阅事件,则问题不存在(因为订阅者和订阅者都可用于垃圾回收)。

【讨论】:

  • 如果你的类是 WPF 控件,你可以使用弱事件管理器来帮助解决这种情况。
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2011-03-14
  • 2020-09-23
  • 2022-08-13
  • 1970-01-01
  • 2016-12-18
  • 2011-08-03
  • 2011-07-04
相关资源
最近更新 更多