.net WeakReference是否具有冗余属性?
NET中的WeakReference实现具有IsAlive属性 1) 使用.net WeakReference是否具有冗余属性?,.net,weak-references,.net,Weak References,NET中的WeakReference实现具有IsAlive属性 1) 使用IsAlive属性或测试Target属性是否为空之间是否存在性能/行为差异 2) IsAlive是否为冗余属性 谢谢。1)不。在内部,IsAlive执行的逻辑与检查目标几乎完全相同,并查看它是否为空 2) 在某种程度上,由于检查ref.Target!=null与ref.IsAlive相当。但是,IsAlive更具表现力,在维护代码时可能更容易理解。1)不。在内部,IsAlive执行的逻辑与检查目标几乎完全相同,并查看其是否
IsAlive
属性或测试Target
属性是否为空之间是否存在性能/行为差异
2) IsAlive
是否为冗余属性
谢谢。1)不。在内部,IsAlive执行的逻辑与检查目标几乎完全相同,并查看它是否为空
2) 在某种程度上,由于检查ref.Target!=null
与ref.IsAlive
相当。但是,IsAlive
更具表现力,在维护代码时可能更容易理解。1)不。在内部,IsAlive执行的逻辑与检查目标几乎完全相同,并查看其是否为空
2) 在某种程度上,由于检查
ref.Target!=null
与ref.IsAlive
相当。但是,IsAlive
更具表现力,在维护代码时可能更容易理解。查看源代码,它们之间的行为没有区别obj.IsAlive
比obj.Target!=null
查看源代码,它们之间的行为没有差异obj.IsAlive
比obj.Target!=null
不难想象一个并发垃圾收集系统,在该系统中,即使暂时持有对某个对象的引用,也很可能导致该对象在下一个GC中存活(在.Net下,这样做的可能性相对较小)。在这样的系统中,使用对象的目标属性来确定对象是否已死亡可能会产生恼人的副作用,使对象的生存时间超过必要的时间。使用IsAlive属性可以避免这种风险
请注意,IsAlive只能可靠地用于确定对象是否已死亡。如果它报告某个对象处于活动状态,那么它可能会也可能不会获取其目标。不难想象一个并发垃圾收集系统,在该系统中,即使暂时持有对某个对象的引用,也很可能导致该对象在下一次GC中存活(在.Net下,这样做的可能性相对较小)。在这样的系统下,使用对象的目标属性来确定对象是否已死亡可能会产生恼人的副作用,使对象的生存时间超过必要的时间。使用IsAlive属性可以避免这种风险
请注意,IsAlive只能可靠地用于确定对象是否已死亡。如果它报告对象处于活动状态,则可能无法获取其目标。请注意,虽然在当前的实现中可能是这种情况,但在可能的硬件辅助并发GC的未来实现中,可能会检索
WeakReference
的目标可能会极大地增加它在下一个集合中存活的可能性;如果对该目标不感兴趣,而只是想从集合中删除WeakReference
本身(如果其目标已死亡),则检查IsAlive
比检查目标要好
。注意,虽然在当前的实现中可能是这种情况,但在可能的硬件辅助并发GC的未来实现中,检索WeakReference
的目标可能会大大增加它在下一个集合中存活的可能性;如果对目标不感兴趣,而仅仅是例如,要从集合中删除WeakReference
本身,如果其目标已死亡,则检查IsAlive
比检查目标要好。