首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WeakReference点播

WeakReference点播
EN

Stack Overflow用户
提问于 2015-12-23 09:31:18
回答 2查看 86关注 0票数 0

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

代码语言:javascript
复制
class TypeA { }

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

代码语言:javascript
复制
class TypeB { private TypeA TypeAObject; } 
class TypeC { private TypeA TypeAObject; } 

我在我自己的课堂上也有关于TypeA的参考资料。

代码语言:javascript
复制
class MyClass { private TypeA TypeAObject; } 

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

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

代码语言:javascript
复制
class MyClass { private WeakReference<TypeA> TypeAObject; } 

这就像预期的那样工作了很长时间,但有时TypeB或TypeC需要来自TypeA的对象。对于这个问题,我认为也有一个解决办法。TypeA对象有一个可以使用的卸载事件。在此之后,没有人再使用该对象。因此,我只是在卸载事件中将对象从TypeA设置为WeakReference。

代码语言:javascript
复制
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后,收集对象。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-23 09:43:04

不,如果不将TypeB或TypeC更改为也使用弱引用,则无法做到这一点。

假设您有一个类,其中其他人只允许说“对不起,您不再被允许保存对该对象的引用”,即使您专门隐藏了对该对象的引用的所有访问。那就不好了。

所以你不能这么做。

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

就当是这样吧。我把家里的地址存储在我的电话联系列表里,我已经在县里登记了,这样他们就知道谁住在那里了。你在postit便条上写下了我的地址,随后又丢失了那张便条,这一事实丝毫没有改变我或县对我的房子的提及。它只会影响你自己的推荐信。

票数 3
EN

Stack Overflow用户

发布于 2015-12-23 09:35:24

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

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

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34432432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档