谁帮我解答一下Dispose、SuppressFinalize、析构函数的概念,联系,区别,执行顺序等等,反正我是挺乱,希望大家帮我理理,顶者有分
我也挺乱的,帮你顶顶吧
Dispose
对象不同,Dispose方法也不太一样.
SuppressFinalize
请求系统不要调用指定对象的完成器方法。
析构函数是自动调用的,它不能被显式调用。当任何代码都不再可能使用一个实例时,该实例就符合被销毁的条件。此后,它所对应的实例析构函数随时均可能被调用。销毁一个实例时,按照从派生程度最大到派生程度最小的顺序,调用该实例的继承链中的各个析构函数。析构函数可以在任何线程上执行
咔咔
还是不明白!!~~
1)Finalize 方法的主要用途是确保在对象释放内存时同时清理谇对象所占有的非托管资源。
2)在封装了非托管类型,如文件、网络连接、数据库连接等,就必须重写 Finalize 方法,以便让 CLR 在垃圾回收时可以回收这些对象所占有的非托管资源。
3)Finalize 是私有方法,它只有在CLR进行垃圾回收时被 CLR 调用,在程序中无法显式调用 Finalize 方法。
4)Dispose 是 CLR 提供给开发人员显式释放对象所占有的非托管资源和关闭对象的方法,因为开发人员知道何时不再使用该对象,但并不能释放托管堆中的内存,释放托管堆中的内存仍有CLR在负责。
5)SuppressFinalize 是告诉 CLR 先不要释放该对象,以免影响它引用了它的对象发生异常
6)一般要析构函数里自动生成调用 Finalize 方法的调用。
以上是个人的理解,请指正!
我现在有一点不明白,那就是为什么有的类偏要实现IDispose接口并实现Dispose的方法,并把释放非托管资源的代码写在里面,然后显式的调用。
我这么办不行吗:
在类里面写一个共有的方法叫MyMethod,这里面写些释放的代码,因为我自己知道什么时候这个类的实例将不再使用,所以我可以在使用完毕的时候调用MyMethod,然后就不管了,反正非托管的资源我已经释放了,剩下的就是垃圾回收器做的事情了。
————————————————————————————————————————
别人使用这些类的时候,难免会感到困惑、不适
还有呀,我觉得 bflovesnow() 说的很有道理,那么这么做不行吗:
我不实现Dispose方法,把所有的非托管资源的释放的代码都写在Finalize的里面,然后就不管了,因为反正垃圾回收器在释放托管资源的同时会调用Finalize方法,也就会释放非托管资源了。
————————————————————————————————————————
什么时候进行垃圾回收是你不能控制的
而很多时候你需要在一个确切的时间就释放掉非托管资源,这样就不能依赖于finalize了,因为你根本不知道什么时候finalize才会被调用
看得我都有点乱了 :)
晕了
这应该就像一个规定样的,你用别人做好的框架,自然要遵守别人定的规矩~~
第一个问题,你把实现模型里面第一条和第五条结合起来看就可以知道这样做的好处了。
1、因为你的类会被谁调用是并不可知的。大家都遵循这个规则便可以保证资源一定被释放。
2、实现了IDispose,结合using语句可以让程序更具可读性。如果上面你的程序中在MyClass MC=new MyClass();和MC.Dispose();之间还有别的代码,就应该使用using块保证Dispose一定会被执行,不用using,也应当使用try...finally结构来保证Dispose一定会被执行。
IDispose是一种规则,就像public等修饰符一样,你可以让所有的东西都public而不要private,这是没问题的,如果程序都是你写的话。但是如果你想要与别人协作的话,就应该遵守这些规则。
第二个问题,C#会根据析构函数自动生成Finalize方法。永远不要在析构函数或者Finalize方法中抛出异常,这会导致严重的后果。