C#对象的销毁和IDisposable

简介:

1.对象的析构函数与Finalize方法

与C++类似,C#允许程序员为类定义一个”析构函数“:

复制代码
class  MyClass
{
    ~MyClass()  //析构函数
    {
         //编写释放非托管的资源
    }
}
复制代码

 上面的代码编译后,可以看到:

这里调用了Object类的Finalize方法,这个方法里面是空的,什么也没有。

与构造函数类似,子类的析构函数会自动调用基类的析构函数,由此不断上溯,到最顶层的Object。上面显示了基类的析构函数是在finally里面执行的,这意味着销毁对象是先完成子类的清理工作,在完成基类的清理工作。如果基类没有定义析构函数,则跳过继续向上搜索。当CLR的GC要回收一个定义了析构函数的对象时,它会自动调用Finalize方法,而且调用Finalize方法的时机是不可控的,最好合适的方法就是让程序员主动以完全可控的方式去释放非托管的资源(例如文件句柄,数据库连接)。为此,.NET提供了IDisposable。

IDisposable接口只定义了一个Dispose方法,任何一个希望"手动"回收的非托管资源的类都应该实现该接口。

public interface IDisposable {void Dispose();},因为CLR认为这个接口就是一般的接口,所以不会主动调用。这需要程序员去调用。为了避免资源泄漏,可以这样:

复制代码
    public class MyClass:IDisposable
    {
        ~MyClass()
        {
            Dispose();
        }

        public void Dispose()
        {
            //
        }
    }
复制代码

Dispose方法应该允许被调用多次而不能引发异常。可以给出比较安全的代码框架:

复制代码
            MyClass obj = new MyClass();
            try
            {
                //使用obj对象
            }
            finally
            {
                IDisposable disposable = obj as IDisposable;
                if (obj != null)
                {
                    obj.Dispose();//是否资源
                }
            }
复制代码

C#提供了using关键来简化上述代码。using(MyClass obj=new MyClass()){//使用obj}

类的析构函数专用于清理非托管的资源,只有类需要提供一个在应用程序里面可随时调用的“显式”清理资源的功能时,才需要实现IDisposable,然而CLR的GC不会自动调用对象的Dispose()方法,只会调用Finalize方法(也就在析构函数里面)

IDisposable编程模式:

复制代码
    public class MyClass : IDisposable
    {
        ~MyClass()
        {
            Dispose();
        }

        public void Dispose()
        {
            Dispose(true);//这样会释放所有的资源
            GC.SuppressFinalize(this);//不需要再调用本对象的Finalize方法
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                //清理托管资源
            }
            //清理非托管资源

        }
    }
复制代码

读书笔记《.NET4.0面向对象编程漫谈》作者:金旭亮老师

本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2013/04/05/csharp-9.html如需转载请自行联系原作者


张雪飞

相关文章
|
8月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
78 0
|
9天前
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
3月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
132 65
|
2月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
4月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
37 2
|
8月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
75 1
|
8月前
|
C#
C#对象初始化器
C#对象初始化器
|
8月前
|
存储 C#
C#对象和类
C#对象和类
50 0
|
8月前
|
存储 C#
C#基础语法(类和对象)
C#基础语法(类和对象)
50 2