将对象设置为null

时间:2012-07-23 00:37:26

标签: c#

只是想知道这是否是从内部终止对象的可接受方式?由于

this = null;

是不可能的。我通常只设置一个名为dispos或something的bo​​ol,如果在终止后访问该对象则抛出异常。但后来这发生在我身上,我认为它可能是一个更清洁的解决方案,但它似乎有点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;
    }
}

2 个答案:

答案 0 :(得分:7)

a是参考文献的副本。将它设置为null所有你喜欢的,它不会影响原始参考。当然,你现在可以改变方法签名以通过ref来获取它的参数,但是你为什么要这样做呢?我无法想象你想在这里解决什么问题。

  

这也可以让垃圾收集器清理我的对象。

GC不需要您设置对null的引用,您没有完成任何有关此想法的内容。你正在抄袭参考文献的副本;对象仍然在内存中,并且GC足够聪明,无论其当前值是否为null,都可以知道给定引用是否有效。

有关详细信息,请参阅this SO thread

答案 1 :(得分:2)

如果您想要明确的确定性破坏,请实现接口IDisposable并在完成对象时调用Dispose。否则,一旦最后一个引用超出范围,垃圾收集器就会销毁该对象。 null一个特定的引用不会触发收集。除非你确定必须这样做,否则不要再猜测垃圾收集器。

你的对象中有什么东西你很想让它尽快被破坏?你绝对不能持有超过必要时间的资源很少,而且介于两者之间 - 数据库连接,套接字,几百MB的内存块。对于那些,IDisposable存在。在GC到达之前,其余的对象将存活几毫秒;这就是垃圾收集世界的生活。在2012年,这被认为是可接受的权衡。