C# 基础系列--类三(析构函数)
析构函数不仅仅 是在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很容易内存溢出。
这章真心的不给力,越是这些基础的越难写。
浙公网安备 33010602011771号