.NET中的WeakReference实现具有IsAlive属性。
1)使用IsAlive
属性或测试Target
属性是否为空之间是否存在任何性能/行为差异?
2)IsAlive
是一个冗余属性?
感谢。
答案 0 :(得分:3)
1)否。在内部,IsAlive与检查目标几乎完全相同,并查看它是否为空。
2)有点,因为检查ref.Target != null
是否与ref.IsAlive
非常相同。但是,IsAlive
更具表现力,在维护代码时可能更容易理解。
答案 1 :(得分:3)
查看源代码,它们之间的行为没有区别。 obj.IsAlive
比obj.Target != null
更方便,更易读。
答案 2 :(得分:0)
不难想象一个并发的垃圾收集系统,其中即使暂时保持对对象的引用也很可能导致该对象在下一个GC中存活(在.Net下,它的可能性相对较小)这样做)。在这样的系统下,使用对象的Target属性来确定它是否已经死亡可能会产生令人讨厌的副作用,即保持对象的活动时间超过必要的时间。使用IsAlive属性可以避免这种风险。
请注意,只能可靠地使用IsAlive来确定对象是否已死。如果它报告对象存活,则可能会或可能不会获得其目标。