2012-05-04 56 views
3

我有兩個類,分別是MyFirstClassMyAnotherClassMyAnotherClass是實現IDiposable接口。這是否處理子對象?

public class MyFirstClass 
{ 
    public string xyz{get;set;} ..... and so on 
} 


public class MyAnotherClass : IDisposable 
{ 
    private readonly MyFirstClass objFc = new MyFirstClass(); 
    public static void MyStaticMethod() 
    { 
     var objOfFirstClass = new MyFirstClass(); 
     // something with above object 
    } 

    public void MyNonStaticMethod() 
    { 
     // do something with objFc 
    } 

    #region Implementation of IDisposable 
    .... my implementations 
    #endregion 
} 

現在我又多了一個課堂,我打電話MyAnotherClass,像這樣

using(var anotherObj = new MyAnotherClass()) 
{ 
    // call both static and non static methods here, just for sake of example. 
    // some pretty cool stuffs goes here... :) 
} 

所以我想知道,我應該擔心我的對象的清理方案?另外,我的ObjFC(非靜態內部)和objOfFirstClass(靜態內部)會發生什麼情況。

據我所知,使用是會照顧的......但我需要知道更多...

+1

「MyFirstClass」類不實現「IDisposable」。這是故意的嗎? – Yogu

+0

是的...這是打算... –

回答

9

objOfFirstClass是在方法的局部變量。一旦該方法退出,它將有資格進行垃圾收集。它不會像這樣處理,因爲它不會執行IDisposable

objFc當其父對象超出範圍時將有資格進行垃圾回收。同樣,這與處置它無關。

Dispose/IDisposable當有清理不是簡單的內存管理其他做被使用。 CLR使用垃圾回收處理清理內存。 using是一種很好的方式,可以確保實現IDisposable的對象在完成時調用Dispose方法 - 但如果您只是在執行內存管理,則不需要使用它。

+0

那麼,如果我在一個IDisposable實現的類中使用靜態方法而該類不是靜態的。靜態對象在其使用後將在內存中可用,或者它將用於垃圾收集? –

+0

定義爲靜態_fields_的對象將保留在內存中,但靜態_methods_中的局部變量將在方法退出後符合條件收集。 –

0

IDispose配置類MyAnotherClass。這意味着MyFirstClass對象的局部變量沒有指向任何東西。因此,一旦垃圾收集器運行,它們就會被回收。

+0

垃圾收集的資格基於超出範圍的變量。處置與它無關。 –

1

除了using調用Dispose方法之外,IDisposable之後沒有任何魔法。

由於類MyFirstClass沒有實現IDisposable,因此不需要擔心此類的實例 - 它們不應該有任何可處置的內容。

如果您有需要處理的字段或變量,則必須致電Dispose。此外,您應該實現析構函數調用Dispose方法,如the reference proposes

~MyClass() { 
    Dispose(false); 
} 

在布爾邏輯參數指定字段應該處置,在這種情況下。有關詳細信息,請參閱鏈接的msdn頁面。

+0

英文MSDN鏈接在英文網站上會更好......;) –

+0

糟糕,我只是查看了源代碼。固定。 – Yogu

2

IDisposable指示對象正在使用資源而不是託管內存;例如文件句柄。 Dispose方法應該處理清理這些資源(這就是你的實現應該做的)。

任何CLR原生對象(例如,那些在你的例子中)是垃圾收集的CLR時,沒有更多的引用(更具體地說,通過一種機制稱爲垃圾收集器或GC);在這些情況下,IDisposable是不必要的。

爲了使用IDisposable您必須自己撥打Dispose(或使用using,它只是語法糖)。它不會被GC自動調用。