C#析构函数

news/2024/7/20 13:43:13 标签: 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


http://www.niftyadmin.cn/n/707425.html

相关文章

JBOSS的启动和停止

本实例使用的JBOSS版本是jboss-4.2.3.GA 假设条件 1、 已设置好JAVA_HOME环境变量 2、 已下载JBoss并且安装目录为:D:\Java\jboss-4.2.3.GA 启动服务器 命令行进入D:\Java\jboss-4.2.3.GA\bin目录,输入run,回车 D:\Java\jboss-4.2.3.GA\bin…

es6 对象添加属性和值_ES6对象操作实例详解

本文实例讲述了ES6对象操作。分享给大家供大家参考,具体如下:1.对象赋值es5中的对象赋值方式如下:let name"小明";let skill es6开发;var obj {name:name,skill:skill};console.log(obj);结果为:ES6允许把声明的变量直接…

java list 查询_Java List 快速搜索对象

比如现在有一个需求现在有一个List 里面装Student 对象 我们想找出这个List 对象里面student name小明的对象 我想很多同学会像以前的我一样变量List 然后去比较 但是这样处理毕竟效率不高 所以今天查资料总结下List list new ArrayList<>();list.add(new Student("…

为什么 React Elements 会有 $$typeof 这个属性?

简评&#xff1a;debug 的时候看到 element 对象中有 $$typeof 这属性&#xff0c;于是查了一下这到底干嘛的。我们知道&#xff0c;通过 JSX 创建一个 React Elements 时&#xff1a; <marquee bgcolor"#ffa7c4">hi</marquee>实际上调用的是 React.crea…

php 多线程pthreads官网翻译

不分享&#xff0c;做一切&#xff01; php拥有令人敬畏的且数量庞大的扩展跟特征&#xff0c;但是php当初设计这门语言的时候&#xff0c;是因为那个时候的web网站远远没有今天的强大&#xff01;现在几乎所有的网站&#xff08;含手机站&#xff09;服务器都是多核的&#xf…

嘉善 机器人比赛_第十一届省青少年机器人大赛嘉善摆擂

比赛现场。看&#xff0c;小选手多专心&#xff01;乒乓球桌大小的赛桌上&#xff0c;两队机器人朝着小足球飞奔而去&#xff0c;砰砰砰地相互撞成了一团。这些踢足球的机器人形状很像小圆凳&#xff0c;头上都顶着个空可乐瓶&#xff0c;肚子里的仪器和电线缠缠绕绕——它们是…

java 数据类型 存储_java中的基本数据类型一定存储在栈中吗?

首先说明&#xff0c;"java中的基本数据类型一定存储在栈中的吗&#xff1f;”这句话肯定是错误的。下面让我们一起来分析一下原因&#xff1a;基本数据类型是放在栈中还是放在堆中&#xff0c;这取决于基本类型在何处声明&#xff0c;下面对数据类型在内存中的存储问题来…

android购物车遇到的问题

近期 做购物车的时候 &#xff0c;遇到几个问题。如今 总结例如以下&#xff1a; 1&#xff1a;不让listview复用组件(购物车。或者有特殊操作的时候)&#xff1a; 自己保存全部的view对象 public View getView(final int position, View convertView, ViewGroup parent) {fina…