3

我有两个类,比如 classMyFirstClassMyAnotherClassMyAnotherClass正在实现 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

4 回答 4

8

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

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

Dispose/用于除了简单的内存管理之外IDisposable的清理工作。CLR 使用垃圾收集为您清理内存。是确保对象实现在完成后调用其方法的好方法 - 但如果您所追求的只是内存管理,则不需要使用它。usingIDisposableDispose

于 2012-05-04T19:34:00.360 回答
1

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

任何 CLR 原生对象(例如,您的示例中的那些)在不再存在对它的引用时由 CLR 进行垃圾收集(更具体地说,通过称为垃圾收集器或 GC 的机制);IDisposable在这些情况下是不必要的。

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

于 2012-05-04T19:36:34.140 回答
0

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

由于该类MyFirstClass没有实现IDisposable,因此无需担心此类的实例——它们不应该有任何东西要处理。

如果您有需要处理的字段或变量,则必须调用Dispose. 此外,您应该实现一个调用该Dispose方法的析构函数,正如参考建议的那样:

~MyClass() {
    Dispose(false);
}

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

于 2012-05-04T19:35:14.500 回答
-1

IDispose配置类MyAnotherClass。这意味着MyFirstClass对象的局部变量没有指向任何东西。因此,一旦垃圾收集器运行,它们就会被回收。

于 2012-05-04T19:34:55.400 回答