这样可以处理子对象吗?

时间:2012-05-04 19:29:34

标签: c# visual-studio clr dispose idisposable

我有两个课程,比如课程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(内部静态)会发生什么。

AFAIK,使用将照顾一切......但我需要了解更多......

4 个答案:

答案 0 :(得分:8)

objOfFirstClass是方法中的局部变量。退出方法后,它将有资格进行垃圾回收。它不会被处理,因为它没有实现IDisposable

objFc的父对象超出范围时,它将有资格进行垃圾回收。同样,这与处理它无关。

Dispose / IDisposable用于清除以外的简单内存管理。 CLR使用垃圾收集处理为您清理内存。 using是确保实现IDisposable的对象在完成后调用其Dispose方法的一种很好的方法 - 但是如果你所追求的只是内存管理,那么你就不会需要使用它。

答案 1 :(得分:1)

IDisposable表示对象正在使用资源而非托管内存;例如,文件句柄。 Dispose方法应该处理这些资源的清理(这就是你的实现应该做的事情)。

当没有更多对它的引用时(更具体地说,通过一种称为垃圾收集器或GC的机制),CLR会对任何CLR本机对象(例如您的示例中的对象)进行垃圾回收;在这些情况下,IDisposable是不必要的。

为了使用IDisposable,您必须自己致电Dispose(或使用using,这只是语法糖。它不会由GC自动调用。

答案 2 :(得分:0)

除了IDisposable调用using方法之外,Dispose背后没有任何魔法。

由于班级MyFirstClass未实现IDisposable,因此无需担心此类的实例 - 他们不应该有任何可处置的内容。

如果您有需要处理的字段或变量,则必须致电Dispose。此外,您应该实现一个调用Dispose方法的析构函数,the reference proposes

~MyClass() {
    Dispose(false);
}

在这种情况下,布尔参数指定应该的字段。有关详细信息,请参阅链接的msdn页面。

答案 3 :(得分:-1)

IDispose处理班级MyAnotherClass。这意味着MyFirstClass对象的局部变量指向任何内容。因此,一旦垃圾收集器运行,它们就会被回收。