• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 全面解读C#编程中的析构函数用法

全面解读C#编程中的析构函数用法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了四个全面解读,吴闲云全面解读西游记,全面解读一带一路,全面二孩政策解读,全面两孩政策解读等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

析构函数用于析构类的实例。
备注
不能在结构中定义析构函数。只能对类使用析构函数。
一个类只能有一个析构函数。
无法继承或重载析构函数。
无法调用析构函数。它们是被自动调用的。
析构函数既没有修饰符,也没有参数。
例如,下面是类 Car 的析构函数的声明:

class Car
{
 ~Car() // destructor
 {
  // cleanup statements...
 }
}
</div>

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

protected override void Finalize()
{
 try
 {
  // Cleanup statements...
 }
 finally
 {
  base.Finalize();
 }
}
</div>

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

注意
不应使用空析构函数。如果类包含析构函数,Finalize 队列中则会创建一个项。调用析构函数时,将调用垃圾回收器来处理该队列。如果析构函数为空,只会导致不必要的性能损失。
程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。程序退出时也会调用析构函数。
可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。
使用析构函数释放资源
通常,与运行时不进行垃圾回收的开发语言相比,C# 无需太多的内存管理。这是因为 .NET Framework 垃圾回收器会隐式地管理对象的内存分配和释放。但是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。当对象符合析构时,垃圾回收器将运行对象的 Finalize 方法。
资源的显式释放
如果您的应用程序在使用昂贵的外部资源,我们还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。可通过实现来自 IDisposable 接口的 Dispose 方法来完成这一点,该方法为对象执行必要的清理。这样可大大提高应用程序的性能。即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对 Dispose 方法的调用失败时清理资源。

下面的示例创建三个类,这三个类构成了一个继承链。类 First 是基类,Second 是从 First 派生的,而 Third 是从 Second 派生的。这三个类都有析构函数。在 Main() 中,创建了派生程度最大的类的实例。注意:程序运行时,这三个类的析构函数将自动被调用,并且是按照从派生程度最大的到派生程度最小的次序调用。

class First
{
 ~First()
 {
  System.Diagnostics.Trace.WriteLine("First's destructor is called.");
 }
}

class Second : First
{
 ~Second()
 {
  System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
 }
}

class Third : Second
{
 ~Third()
 {
  System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
 }
}

class TestDestructors
{
 static void Main()
 {
  Third t = new Third();
 }

}

</div>

输出:

 Third's destructor is called.
 Second's destructor is called.
 First's destructor is called.
</div>


析构函数与Dispose()方法的区别
1. Dispose需要实现IDisposable接口。

2. Dispose由开发人员代码调用,而析构函数由GC自动调用。

3. Dispose方法应释放所有托管和非托管资源。而析构函数只应释放非托管资源。因为析构函数由GC来判断调用,当GC判断某个对象不再需要的时候,则调用其析构方法,这时候该对象中可能还包含有其他有用的托管资源。

4. 通过系统GC频繁的调用析构方法来释放资源会降低系统性能,所以推荐显示调用Dispose方法。

5. Dispose方法结尾处加上代码“GC.SuppressFinalize(this);”,即告诉GC不需要再调用该对象的析构方法,否则,GC仍会在判断该对象不再有用后调用其析构方法,虽然程序不会出错,但影响系统性能。

6、析构函数 和 Dispose 释放的资源应该相同,这样即使类使用者在没有调用 Dispose 的情况下,资源也会在 Finalize 中得到释放。

7、Finalize 不应为 public。

8、有 Dispose 方法存在时,应该调用它,因为 Finalize 释放资源通常是很慢的。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 全面解读C#编程中的析构函数用法

相关文章

  • 2017-05-28C#获取网页源代码的方法
  • 2017-05-28C#实现简单播放mp3的方法
  • 2017-05-28C#使用Object类实现栈的方法详解
  • 2017-05-28C#中datagridview使用tooltip控件显示单元格内容的方法
  • 2017-05-28asp.net中调用oracle存储过程的方法
  • 2017-05-28C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法
  • 2017-05-28C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
  • 2017-05-28newtonsoft.json解析天气数据出错解决方法
  • 2017-05-28C# 基础入门--关键字
  • 2017-05-28c#实现几种数据库的大数据批量插入

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现向多线程传参的三种方式实例分析
    • 详解C# Socket简单例子(服务器与客户端通信)
    • 自定义实现Json字符串向C#对象转变的方法
    • 实例解析C#设计模式编程中简单工厂模式的使用
    • C#简单读取主机上所有进程的方法
    • C#使用回溯法解决背包问题实例分析
    • C#索引器简单实例代码
    • BootStrap mvcpager分页样式(get请求,刷新页面)
    • C#定时器和随机数
    • C#利用Openxml读取Excel数据实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有