【问题标题】:How can I get rid of an instance once and for all?我怎样才能一劳永逸地摆脱一个实例?
【发布时间】:2014-10-01 10:55:49
【问题描述】:

我有一个对象的实例 - 我怎样才能摆脱它?

想象一下:

item1 = new MyItem( 123, "Test Item", "I am a test item" );
item2 = item3 = item1;
item1 = null;

我创建了一个 MyItem 的实例,并在我的代码中到处使用它(因此在不同的脚本中有多个对它的引用)。但是现在我想说:这个项目已经不存在了!

如果我只将其中一个设置为 null,则该实例将继续存在,而其他引用仍指向它。

有没有办法一劳永逸地销毁实例,让所有引用都为空?

【问题讨论】:

  • 为什么?你想达到什么目的?将不再引用的变量设置为 null 不会执行任何操作。
  • 如果你认为你需要这个,那么你已经做错了。
  • 我正在做的是:我有大量的项目和一个单例来访问项目列表。每当我的程序中的任何内容需要使用某个项目时,它都会从列表中获取一个引用。所有这些都来自外部数据库。如果一个项目得到更新,同步脚本会在单例上更改它,并且每个其他脚本都会自动知道它。但是:如果一个项目在数据库中被删除并且我在单例中将该项目设置为空,那么其他人都不会知道它。这就是为什么我想知道是否有一种简单的方法可以清除所有引用并让所有人都知道该项目已消失。
  • 问题似乎是在“它从列表中获取引用” 之后,该引用被缓存(时间过长)。只是不要那样做。
  • 每次需要时抓取项目而不是缓存它是否存在性能限制?

标签: c# oop unity3d instance


【解决方案1】:

(1) 你应该寻找WeakReference 类。这样你就可以“持有”一个实例而不增加它们的引用计数。但这会使您的软件更加复杂并且容易出错。

http://msdn.microsoft.com/en-us/library/system.weakreference(v=vs.110).aspx


(2) 您可以创建一个带有IsAvailable 属性的包装器,它将容纳一个实例。

【讨论】:

  • 我想我可以在将项目引用设置为 null 之前添加一个设置为 true 的 wasDeleted 属性或字段,并在每次脚本想要访问其对项目的引用时检查它?
  • 是的,如果你跨线程访问你的对象,别忘了加锁。
  • WeakReference 在这里没有提供解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2016-07-20
  • 2017-06-16
相关资源
最近更新 更多