我有两个课程,比如课程MyFirstClass
和MyAnotherClass
,MyAnotherClass
正在实施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,使用将照顾一切......但我需要了解更多......
答案 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
对象的局部变量指向任何内容。因此,一旦垃圾收集器运行,它们就会被回收。