2012-07-23 70 views
1

想知道这是否是一种可接受的方式从本身终止对象?由于将对象设置为null本身内部为空

this = null; 

是不可能的。我通常只是设置一个名为dispos或者bool的布尔,如果在终止它之后访问该对象,则抛出异常。但后来这发生在我身上,我认为这可能是一个更清洁的解决方案,但它似乎有点哈克,所以我想第二个意见。我应该坚持设置一个布尔或去与此。这也将允许垃圾收集器清理我的对象。

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

一个不会“将一个对象设置为null”,而是将null赋值给一个以前可能非空的*变量*(或其他可变存储位置)。这又可能会使先前命名的对象为no更强烈的可达性。 – 2012-07-23 01:35:26

回答

7

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

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

的GC不需要你要引用设置为null,你不完成这个想法什么。你在抄袭参考文献;该对象仍在内存中,并且GC足够聪明,可以知道给定参考是否有效,而不管其当前值是否为null

请参阅this SO thread了解更多详情。

+0

哦太棒了。我认为垃圾收集器只清理空对象。谢谢! – Axis 2012-07-23 00:45:48

+0

@轴:这将是很少(不是?)比手动分配和释放更好;) – 2012-07-23 00:46:29

+2

好吧,我要去了解GC现在是如何运作的... – Axis 2012-07-23 00:48:20

2

如果你想要明确的确定性销毁,实现接口IDisposable并在完成对象时调用Dispose。否则,只要最后一个引用超出范围,垃圾收集器就会销毁该对象。一个特定的参考文献不会触发该集合。不要第二次猜测垃圾回收器,除非你确定必须知道。

什么是你的对象,你是如此渴望它尽快销毁?您绝对无法承受的时间超过必要的资源很少甚至在两者之间 - 数据库连接,套接字,几百MB的内存块。对于那些,IDisposable存在。剩下的对象在GC到达之前会活几毫秒;这就是垃圾收集世界的生活。在2012年,这被认为是可以接受的折衷。

相关问题