2012-05-04 26 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自动调用。