析构函数不仅仅 是在C中用,其实在C#也是有这个的,写法很简单
~类名 (){}
先给示例代码吧,。我们先新建两个项目--AssemblyLibrary(类库)和ConsolTest(控制台)
AssemblyLibrary
public class DisposaClass //:IDisposable { public string a = "1111"; ~DisposaClass() { a = string.Empty; Console.WriteLine("Press enter to Destroy it"); } }
ConsolTest
static void Main(string[] args) { DisposaClass dis = new DisposaClass(); //dis.Dispose(); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); System.GC.Collect(); System.Threading.Thread.Sleep(10000); Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); dis = null; Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false)); Console.Read(); }
System.GC.Collect()这个是清理内存的方法, GC.GetTotalMemory(false) 检索当前认为要分配的字节数
在代码中,我还特意的 把对象置为null和让进程休眠了下,理论上来说,对象dis应该是被彻底释放完,那控制台是不是就打印出 :Press enter to Destroy it 呢?
很遗憾,没有出现 Press enter to Destroy it 。这个很简单,GC的调用时系统控制的,我们也只是能发出指令,希望他清理内存,而不能强制他清理内存。
对于 一些对象而已,只要能 protected override void Finalize 的,不需要 ~ 类名 ,来实现析构函数 ,你override Finalize 就可以了。
0:32 了 。就不给例子了~~~
如果你说,析构函数 是 系统调用的,我们希望手动的调用呢?如果你 希望如此,那么就继承 接口IDisposable 就可以 了
public class DisposaClass :IDisposable { public string a = "1111"; ~DisposaClass() { a = string.Empty; Console.WriteLine("Press enter to Destroy it"); } public void Dispose() { a = string.Empty; } }
IDisposable 和 ~类名,的组合可以对内存的清理有不错的效果
Public class MyClass:IDisposable { private bool IsDisposed=false; public void Dispose() { Dispose(true); GC.SupressFinalize(this); } protected void Dispose(bool Diposing) { if(!IsDisposed) { if(Disposing) { //Clean Up managed resources } //Clean up unmanaged resources } IsDisposed=true; } ~MyClass() { Dispose(false); } }
我跟人很少用这样做,虽然他可以有效的控制内存,我 之前做PDA的时候,才用了下单例和这些~~因为内存实在是太小了。
尽管如此我们花费一些时间实现IDisposable接口,如果客户不能合适地调用它们会怎样?为此C#有一个酷的解决方案。‘using’代码块。它看起来像这样:
using (MyClass objCls =new MyClass()) { }
这个也是我现在比较喜欢用的方式,不需要自己Dispose对象。 特别是在winfrom中写自定义控件,如果不Dispose很容易内存溢出。
这章真心的不给力,越是这些基础的越难写。