我有一个来自TypeA的复杂类(TypeA还没有由我创建)。
class TypeA { }这些对象由我无法访问的不同类持有:
class TypeB { private TypeA TypeAObject; }
class TypeC { private TypeA TypeAObject; } 我在我自己的课堂上也有关于TypeA的参考资料。
class MyClass { private TypeA TypeAObject; } 现在我有了以下问题。如果我的类是从垃圾收集中收集的,TypeAObject就不会被释放,因为TypeB和TypeC在TypeAObject上仍然有一个引用。
对于这个问题,我认为WeakReferenc是解决方案:
class MyClass { private WeakReference<TypeA> TypeAObject; } 这就像预期的那样工作了很长时间,但有时TypeB或TypeC需要来自TypeA的对象。对于这个问题,我认为也有一个解决办法。TypeA对象有一个可以使用的卸载事件。在此之后,没有人再使用该对象。因此,我只是在卸载事件中将对象从TypeA设置为WeakReference。
class MyClass
{
private TypeA TypeAObject;
private WeakReference<TypeA> TypeAObjectWeak;
public void SetUnloaded()
{
TypeAObject.Unloaded = () => {TypeAObjectWeak = new WeakReference<TypeA>(TypeAObject) };
}
} 但是TypeAObject并没有被收集。这就是我现在要问的问题:是否有办法按需为WeakReference设置一个对象?
编辑
类TypeA在我的例子中是一个类型为WorkflowApplication (http://referencesource.microsoft.com/#System.Activities/System/Activities/WorkflowApplication.cs,533e298006a3d9ca)的类
=>问题是WorkflowApplication (i.a )的事件。UnhandledException,Idle,)将它们设置为null后,收集对象。
发布于 2015-12-23 09:43:04
不,如果不将TypeB或TypeC更改为也使用弱引用,则无法做到这一点。
假设您有一个类,其中其他人只允许说“对不起,您不再被允许保存对该对象的引用”,即使您专门隐藏了对该对象的引用的所有访问。那就不好了。
所以你不能这么做。
WeakReference根本不是影响对象的东西,它只是保存对对象的引用的另一种方式。任何非弱引用都和以前一样强,即使您开始在其他地方使用弱引用。
就当是这样吧。我把家里的地址存储在我的电话联系列表里,我已经在县里登记了,这样他们就知道谁住在那里了。你在postit便条上写下了我的地址,随后又丢失了那张便条,这一事实丝毫没有改变我或县对我的房子的提及。它只会影响你自己的推荐信。
发布于 2015-12-23 09:35:24
您仍然对TypeAObject中的对象有很强的引用。将其设置为null,并且应该收集它。
如果您只想收集对象,为什么需要弱引用?
https://stackoverflow.com/questions/34432432
复制相似问题