1

.NET 中的 WeakReference 实现具有 IsAlive 属性。

IsAlive1) 使用该属性或测试该Target属性是否不为空之间是否存在任何性能/行为差异?

2)IsAlive是冗余属性吗?

谢谢。

4

3 回答 3

3

1) 不。在内部,IsAlive 执行与检查目标几乎完全相同的逻辑,并查看它是否为空。

2)有点,因为检查是否ref.Target != null几乎等同于ref.IsAlive. 但是,IsAlive在维护代码时更具表现力,并且可能更容易理解。

于 2009-10-21T01:52:20.913 回答
3

查看源代码,它们之间的行为没有区别。 obj.IsAlive只是更方便和可读obj.Target != null

于 2009-10-21T01:53:07.867 回答
0

不难想象一个并发的垃圾收集系统,即使是暂时持有一个对象的引用,也很有可能导致该对象在下一次 GC 中存活下来(在 .Net 下,这样做的可能性相对较小)。在这样的系统下,使用对象的 Target 属性来确定它是否已死可能会产生烦人的副作用,即使对象的存活时间超过必要的时间。使用 IsAlive 属性可以避免这种风险。

请注意,IsAlive 只能可靠地用于确定对象是否已死亡。如果它报告一个对象是活的,它可能会也可能不会获得它的目标。

于 2011-02-19T00:14:36.570 回答