析构方法是在垃圾回收、释放资源时使用的。
析构函数用于析构类的实例。

备注:

    不能在结构中定义析构函数。只能对类使用析构函数。
    一个类只能有一个析构函数。
    无法继承或重载析构函数。
    无法调用析构函数。它们是被自动调用的。
    析构函数既没有修饰符,也没有参数。

析构方法的定义语法形式如下。
!!!!!!!!!!!!!!!
注意:析构方法的方法名必须与当前所在类名一样。

~方法名()
{
    语句块;
}
下面是类 Car 的析构函数的声明

    class Car
{
public int CarID { get; set; }
~Car()
{
//在析构函数中,可以执行释放其他托管资源处理
Console.WriteLine($"当前Car对象被释放,CarID={CarID}");
}
}

该析构函数隐式地对对象的基类调用 Finalize。这样,前面的析构函数代码被隐式地转换为:

    protected override void Finalize()
{
try
{
// cleanup statements...
}
finally
{
base.Finalize();
}
}

这意味着对继承链中的所有实例递归地调用 Finalize 方法(从派生程度最大的到派生程度最小的)。

注意

不应使用空析构函数。如果类包含析构函数,Finalize 队列中则会创建一个项。调用析构函数时,将调用垃圾回收器来处理该队列。如果析构函数为空,则只会导致不必要的性能丢失

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

可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。有关更多信息,请参见强制垃圾回收

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

如果您的应用程序在使用昂贵的外部资源,则还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。可通过实现来自 IDisposable 接口的 Dispose 方法来完成这一点,该方法为对象执行必要的清理。这样可大大提高应用程序的性能。即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对 Dispose 方法的调用失败时清理资源。

    static void TestOne()
{
Car car1 = new Car() { CarID = 1 };
//将car1引用设置为空
car1 = null; //手动调用GC垃圾回收
Console.WriteLine("手动触发垃圾回收>");
GC.Collect(); //释放内存操作,是异步执行的
Console.WriteLine(car1 == null);
}

特别说明:

1.静态类GC中提供了强制回收的接口

2.回收操作是异步执行的

最新文章

  1. ComponentPattern (组合模式)
  2. block为什么用copy以及如何解决循环引用
  3. 我JSP学习心得1
  4. js获取当前日期
  5. 1.13 linux笔记
  6. Centos下安装Redis
  7. 06章 Struts2国际化
  8. html第二天CSS
  9. C++ 一个程序获取另一个程序Edit控件的内容
  10. std::list
  11. svn文件清理Bat脚本
  12. 201512读书分享——读《做自己的No.1》“哪一天”是永远不会到来的
  13. SQL查询表字段、字段说明、类型、长度、主键
  14. android启动activity文本框不获得焦点
  15. ONFI闪存数据通道接口标准
  16. js--事件对象的理解5-
  17. 两个java项目,跨域访问时,浏览器不能正确解析数据问题
  18. php程序员面试经验
  19. 【luogu P4007 清华集训2017】小Y和恐怖奴隶主
  20. Elasticsearch6.3.2启动过程源码阅读记录

热门文章

  1. JUC之Fork/Join框架
  2. DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | TRAINING A CLASSIFIER
  3. Servlet-base标签的作用(相对路径和绝对路径)
  4. windows下使用LTP分词,安装pyltp
  5. shiro 快速入门详解。
  6. JVM 问题分析思路
  7. 洛谷P4859 已经没有什么好害怕的了
  8. div置顶
  9. Linux 打包压缩、软链接、硬链接、配置镜像源
  10. Python重载比较运算符