WeakReference是否具有冗余属性?

时间:2009-10-21 01:48:12

标签: .net weak-references

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

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

2)IsAlive是一个冗余属性?

感谢。

3 个答案:

答案 0 :(得分:3)

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

2)有点,因为检查ref.Target != null是否与ref.IsAlive非常相同。但是,IsAlive更具表现力,在维护代码时可能更容易理解。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

请注意,只能可靠地使用IsAlive来确定对象是否已死。如果它报告对象存活,则可能会或可能不会获得其目标。