zoukankan      html  css  js  c++  java
  • 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》如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

  • 相关阅读:
    CentOS常用的文件操作命令总结
    消息队列技术
    net license tool, EasyLicense !
    Socket、Session、Option和Pipe
    安全配置基线Linux系统
    SolrCloud
    线性表
    微服务系统中的认证策略
    How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway
    使用Akka、Kafka和ElasticSearch等构建分析引擎 -- good
  • 原文地址:https://www.cnblogs.com/May-day/p/6723793.html
Copyright © 2011-2022 走看看