来岛国已经45天了,感觉一切都没有想象的那么好,看来还是得多努力了,从头开始吧!今天废话不多说了,开始学习:
今天学习下析构函数吧,
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
备注:
1、不能在结构中定义析构函数。 只能对类使用析构函数;
2、一个类只能有一个析构函数。
3、无法继承或重载析构函数
4、无法调用析构函数。 它们是被自动调用的。
5、析构函数既没有修饰符,也没有参数。
下面就来学学msdn上的列子吧;
class Car
{
~Car() // destructor
{
// cleanup statements...
}
}
该析构函数隐式地对对象的基类调用 Finalize。 这样,前面的析构函数代码被隐式地转换为以下代码:
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}
这意味着对继承链中的所有实例递归地调用 Finalize 方法(从派生程度最大的到派生程度最小的)。不应使用空析构函数。 如果类包含析构函数,Finalize 队列中则会创建一个项。 调用析构函数时,将调用垃圾回收器来处理该队列。 如果析构函数为空,只会导致不必要的性能损失。
可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。
通常,与运行时不进行垃圾回收的开发语言相比,C# 无需太多的内存管理。 这是因为 .NET Framework 垃圾回收器会隐式地管理对象的内存分配和释放。 但是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。 当对象符合析构时,垃圾回收器将运行对象的 Finalize 方法。
资源的显式释放:
定义一种释放分配的资源的方法, 如果您的应用程序在使用昂贵的外部资源,我们还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。 可通过实现来自 IDisposable (定义一种释放分配的资源的方法)接口的 Dispose(执行与释放或重置非托管资源相关的应用程序定义的任务。) 方法来完成这一点,该方法为对象执行必要的清理。 这样可大大提高应用程序的性能。 即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对 Dispose 方法的调用失败时清理资源。
class Demo : IDisposable
{
//指向外部的非托管资源
private IntPtr handle;
//其他管理资源类使用
private Component component = new Component();
//跟踪是否已调用了Dispose。
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
Console.WriteLine("Dipose");
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
//处置托管资源。
component.Dispose();
}
CloseHandle(handle);
handle = IntPtr.Zero;
disposed = true;
}
Console.WriteLine("Dipose(bool)");
}
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
~Demo()
{
Dispose(false);
Console.WriteLine("~Demo");
}
public Demo(IntPtr handle)
{
this.handle = handle;
Console.WriteLine("Demo(IntPtr handle)");
}
public static void Main()
{
Console.WriteLine("Process Start~");
}
}