析构函数(C# 编程指南)

简介:
  • 不能在结构中定义析构函数。 只能对类使用析构函数。

  • 一个类只能有一个析构函数。

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

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

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

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

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

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

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

    注意

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

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

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

    -----------------------------------------
  • http://topic.csdn.net/u/20100203/20/93821dcb-0ed5-4f47-9ac9-7581017d0d9b.html
  • 以下摘自csdn论坛帖子  
  • 是的,楼主需要注意"析构函数"有“复活”一说。
  •  

  • 当某种类型实现了 Finalize() 后,该对象将进行特殊的看待:此类型对象放置在GC的特殊位置——终结列表。
    1、当进行第一次垃圾收集时,此类若没有其他引用,GC会对其进行回收,此时这些对象被认为是垃圾。进行GC.Collect 时,这些垃圾会被运送到另一个位置—— 终结可达队列。而终结可达队列,类似于全局或静态变量,会被当成一种GCRoot;
    2、被放置在此队列(终结可达队列)中的对象,认为是可以访问的,因此可以认为这些对象原先被当成垃圾的对象【1中提到的对象】得到了“复活”,
    3、当第一次 GC.Collect 执行后,GC会清空终结可达队列,此时【1】中的对象才是真正的垃圾。
    4、等待下次执行 GC.Collect 时,【1】中对象才能完全被清理掉

    其次,实现了 Finalize() 的对象,微软不保证其执行顺序,即:A,B 的Finalze的执行顺序是不保证的,因此不建议在A的 Finalize中访问B,或反推。因此,在实现Finalize时,微软推荐做法是同时实现 IDisposable 和 Finalize() ,即: IDisposable模式【直接取MSDN的实例】

非托管资源的释放与托管资源释放不一样,即使在将非托管对象置为null 或 null,其资源也不一定能释放。这个主要是非托管的资源的资源需手动释放【主要是历史问题,dotnet 之前没有GC的原因】。
其次,将托管对象(不包括静态变量,静态变量被GC当成root,这个可以用 windbg 之类的调试器看到)置为null 或 0,并不能“马上”释放其资源,什么时间执行析构,是GC决定的,主要是如下几个条件(可能不完全,可以查找相关内容):
.0代对象充满
.显示调用GC.Collect();
.内存不足
.CLR 程序域被卸载
.CLR 停止
 















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/566366,如需转载请自行联系原作者



相关文章
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
20 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
75 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
57 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
60 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
38 0
|
3天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
3天前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
|
4天前
|
IDE 程序员 C#
C#编程入门:从零开始的旅程
【4月更文挑战第20天】本文引导初学者入门C#编程,从环境搭建开始,推荐使用Visual Studio Community版作为IDE。接着,通过编写"Hello, World!"程序,介绍基本语法,包括数据类型、运算符和表达式。文章还涉及控制结构、函数和方法,以及面向对象编程概念。通过学习,读者将对C#有初步了解,并激发进一步探索编程世界的兴趣。
|
4天前
|
开发框架 .NET Java
探索 C#编程的奥秘与魅力
【4月更文挑战第20天】C#是微软开发的现代、面向对象的编程语言,以其简洁语法、强大功能和跨平台支持脱颖而出。它支持自动垃圾回收、泛型、委托、LINQ,并广泛应用于桌面、Web、移动和游戏开发。C#拥有活跃的开发者社区和丰富的资源,是Unity游戏开发的首选语言。随着.NET Core,C#可在多个操作系统上运行,持续创新,未来发展潜力巨大。