只是想知道这是否是从内部终止对象的可接受方式?由于
this = null;
是不可能的。我通常只设置一个名为dispos或something的bool,如果在终止后访问该对象则抛出异常。但后来这发生在我身上,我认为它可能是一个更清洁的解决方案,但它似乎有点hacky所以我想要第二个意见。我应该坚持设置一个布尔或与此一起去。这也可以让垃圾收集器清理我的对象。
public class A
{
public A()
{
}
public void Method()
{
try
{
//Do Something.
}
catch
{
//If it fails destroy the object
Destroy(this);
}
}
private static void Destroy(A a)
{
a = null;
}
}
答案 0 :(得分:7)
a
是参考文献的副本。将它设置为null
所有你喜欢的,它不会影响原始参考。当然,你现在可以改变方法签名以通过ref
来获取它的参数,但是你为什么要这样做呢?我无法想象你想在这里解决什么问题。
这也可以让垃圾收集器清理我的对象。
GC不需要您设置对null
的引用,您没有完成任何有关此想法的内容。你正在抄袭参考文献的副本;对象仍然在内存中,并且GC足够聪明,无论其当前值是否为null
,都可以知道给定引用是否有效。
有关详细信息,请参阅this SO thread。
答案 1 :(得分:2)
如果您想要明确的确定性破坏,请实现接口IDisposable并在完成对象时调用Dispose。否则,一旦最后一个引用超出范围,垃圾收集器就会销毁该对象。 null
一个特定的引用不会触发收集。除非你确定必须这样做,否则不要再猜测垃圾收集器。
你的对象中有什么东西你很想让它尽快被破坏?你绝对不能持有超过必要时间的资源很少,而且介于两者之间 - 数据库连接,套接字,几百MB的内存块。对于那些,IDisposable存在。在GC到达之前,其余的对象将存活几毫秒;这就是垃圾收集世界的生活。在2012年,这被认为是可接受的权衡。