2012-07-23 89 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年,這被認爲是可以接受的折衷。

相關問題