C#析构函数

一,什么是析构函数?

 在msdn中的解析:析构函数用于析构类的实例。

         class A                         // 基类First
        {
            ~A()                        // 析构函数
            {
                Console.WriteLine("~A()析构函数");
            }
        }    

特性:

1》不能在结构中定义析构函数。 只能对类使用析构函数。

2》一个类只能有一个析构函数。

3》无法继承或重载析构函数。

4》无法调用析构函数。 它们是被自动调用的。

5》析构函数既没有修饰符,也没有参数。

二,使用析构函数的有什么用?

一,程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。 垃圾回收器检查是否存在应用程序不再使用的对象。 如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。 程序退出时也会调用析构函数。

二,使用析构函数释放资源
通常,与运行时不进行垃圾回收的开发语言相比,C# 无需太多的内存管理。 这是因为 .NET Framework 垃圾回收器会隐式地管理对象的内存分配和释放。 但是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。 当对象符合析构时,垃圾回收器将运行对象的 Finalize 方法

三,那析构函数和构造函数有什么区别?先上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XigouMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            C c = new C();             // 创建类的实例
        }

        class A                         // 基类First
        {
            ~A()                        // 析构函数
            {
                Console.WriteLine("~A()析构函数");
            }
            public A()
            {                            // 构造函数
                Console.WriteLine("A()构造函数");
            }
        }
        class B : A                     // B类从A类派生
        {
            ~B()                        // 析构函数
            {
                Console.WriteLine("~B()析构函数");
            }
            public B()                   // 构造函数
            {
                Console.WriteLine("B()构造函数");
            }
        }
        class C : B                     // C类从B类派生
        {
            ~C()                        // 析构函数
            {
                Console.WriteLine("~C()析构函数");
            }
            public C()                  // 构造函数
            {
                Console.WriteLine("C()构造函数");
            }
        }
    }
}

结果:

四,总结:

1》程序运行时,这三个类的析构函数将自动被调用,调用顺序是按照从派生程度最大的(~C())到派生程度最小的(~A())次序调用的,和构造函数的调用顺序正好相反。则可以得出,当用户创建类的对象是调用构造函数,而当该对象已经调用完毕时,使用析构函数

2》析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。

3》析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
4》析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~A( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。

4》如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

原文地址:https://www.cnblogs.com/May-day/p/6723793.html