WeakReference on Demand

时间:2015-12-23 09:31:19

标签: c# .net

我有一个来自TypeA的复杂类(TypeA没有由我创建)。

class TypeA { }

这些对象由我无法访问的不同类别持有:

class TypeB { private TypeA TypeAObject; } 
class TypeC { private TypeA TypeAObject; } 

我也在自己的班级中引用了TypeA。

class MyClass { private TypeA TypeAObject; } 

现在我有以下问题。如果从垃圾收集中收集我的类,则不会释放TypeAObject,因为在TypeAObject上仍然存在TypeB和TypeC的引用。

对于这个问题,我认为WeakReferenc将是解决方案:

class MyClass { private WeakReference<TypeA> TypeAObject; } 

按预期工作很长时间,但有时TypeB或TypeC需要TypeA中的Object。对于这个问题,我认为也有一个解决方案。 TypeA Objects有一个我可以使用的Unloaded事件。在此之后,没有人再次使用该对象。所以我只是在Unloaded事件中将Object从TypeA设置为WeakReference。

class MyClass 
{ 
  private TypeA TypeAObject;
  private WeakReference<TypeA> TypeAObjectWeak;

  public void SetUnloaded()
  {
        TypeAObject.Unloaded = () => {TypeAObjectWeak = new WeakReference<TypeA>(TypeAObject) };
  }

} 

但是没有收集TypeAObject。现在我的问题是:有没有办法按需将对象设置为WeakReference?

修改

Class TypeA在我的例子中是一个类型为WorkflowApplication的类 (http://referencesource.microsoft.com/#System.Activities/System/Activities/WorkflowApplication.cs,533e298006a3d9ca

=&GT;问题是WorkflowApplication的事件(即,UnhandledException,Idle,...)。将它们设置为null后,收集了对象。

2 个答案:

答案 0 :(得分:3)

不,如果不改变TypeB或TypeC也不能使用弱引用。

想象一下,你有一个班级,允许其他人只是说&#34;对不起,你不再允许持有对这个对象的引用&#34;即使您特别隐藏了对该对象的引用的所有访问权限。那会很糟糕。

所以你不能这样做。

WeakReference根本不会影响对象,它只是一种不同的方式来保存对象的引用。任何非弱引用都和以前一样强大,即使你开始在其他地方使用弱引用。

像这样考虑一下。我的房子地址存放在我手机上的联系人列表中,我已经在县里注册了,以便他们知道住在那里的人。你在便条纸上写下我的地址并随后丢失了那张纸条的事实并没有以任何方式改变我或县对我家的引用。它只会影响你自己的参考。

答案 1 :(得分:-3)

你仍然对TypeAObject中的对象有强烈的引用。将其设置为null,应该收集它。

如果您只想收集对象,为什么还需要弱引用?