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