任何人都可以清楚地解释Dispose,Destructor和Finalize在.NET中的区别吗?
何时使用它们?处理和析构函数.Net
1
A
回答
1
如果一个类实现了IDisposable
,那么调用该类的构造函数的任何人都应确保生成的实例的方法将在该实例的最后一次使用和其放弃之间的某个时间被调用。通常情况下,一个类将实现IDisposable
,如果在其生命周期的某个时间点,一个实例会要求其他实体(可能只是任何东西,甚至可能不在同一台计算机上!)开始代表它做某件事情,除非有其他指示,否则其他实体会这样做。方法将使实例指示所有这些实体,他们不再需要为其代表他们正在做的任何事情做任何事情。
为了在不首先调用IDisposable.Dispose()
时允许(错误地)放弃对象,如果系统发现它们已被放弃,.net和Java允许对象请求通知。这种通知采用调用方式Finalize
。请注意,无法保证对象放弃和调用Finalize()
之间经过的时间。在某些情况下,如果不小心,系统可能会在对象正在忙于使用其他代表它的对象的服务时调用Finalize
(从而导致其他对象在它们仍然处于停止状态时停止提供其服务需要)。由于C#标准的创建者并不喜欢人们编写代码的想法,因此需要框架在每个对象中包含可覆盖的Finalize
方法,因此C#编译器不允许代码覆盖finalize。相反,出于被遗弃的对象可以并且应该是可移植的错误信念,他们需要使用类似于C++析构函数的语法编写一段代码。这样的块被称为析构函数,虽然它不像C++那样。相反,它会生成Finalize
以及其他一些代码的覆盖。请注意,任何在.net中正确使用析构函数的代码都必须使用方法GC.SuppressFinalize()
和GC.KeepAlive()
,因此要求使用析构函数序列而不是Object.Finalize()
覆盖,并不会增强可移植性。
相关问题
- 1. 使用析构函数/处理基类?
- 2. 执行析构函数/处理代码
- 3. 处置敲定和析构函数
- 4. 结构和析构函数
- 5. 构造函数和析构函数 - C++
- 6. 析构函数和python
- 7. 如何处理.NET中的构造函数over-injection
- 8. 处理函数和参数
- 9. 如何处理抛出异常的文件析构函数?
- 10. 编译器如何处理派生析构函数中的基类析构函数调用?
- 11. SIGINT处理和函数getline
- 12. 构造函数没有定义[处理]
- 13. 处理构造函数的异常
- 14. Excel VBA对象构造函数和析构函数
- 15. C中的析构函数和构造函数C
- 16. 成员构造函数和析构函数调用的顺序
- 17. 堆 - 构造函数和析构函数,内存分配
- 18. 默认构造函数和析构函数是否内联?
- 19. 对构造函数和析构函数的未定义引用
- 20. emplace_back调用移动构造函数和析构函数
- 21. boost :: lock_guard分配,构造函数和析构函数开销
- 22. std :: vector :: clear()在构造函数和析构函数中
- 23. 外部调用拷贝构造函数和析构函数
- 24. 复制构造函数和析构函数八叉树C++
- 25. C++中的构造函数和析构函数与C#比较
- 26. mootools析构函数
- 27. Pcrecpp析构函数
- 28. WPF析构函数
- 29. 与析构函数
- 30. Zend“析构函数”?