例如:
public class Person
{
public Person()
{
}
~Person()
{
}
}
什么时候应该手动创建析构函数?您何时需要创建析构函数?
例如:
public class Person
{
public Person()
{
}
~Person()
{
}
}
什么时候应该手动创建析构函数?您何时需要创建析构函数?
Answers:
更新:这个问题是我2015年5月的博客主题。感谢您提出的好问题!请参阅博客,以获取人们通常相信的关于终结的虚假列表。
什么时候应该手动创建析构函数?
几乎从不。
通常,只有当您的类持有一些昂贵的非托管资源时才创建一个析构函数,该资源在对象消失时必须清除。最好使用一次性模式以确保清理资源。那么从本质上讲,析构函数可以确保,如果对象的使用者忘记处理该对象,则该资源最终仍会被清除。(也许。)
如果您要使析构函数非常小心,请了解垃圾收集器的工作原理。析构函数真的很奇怪:
在析构函数中,通常没有什么是正确的。要非常非常小心。编写正确的析构函数非常困难。
您何时需要创建析构函数?
测试编译器中处理析构函数的部分时。我从来不需要在生产代码中这样做。我很少编写处理非托管资源的对象。
它被称为“ finalizer”,通常只应为状态(即字段)包含非托管资源(即:指向通过p / invoke调用检索到的句柄的指针)的类创建一个。但是,在.NET 2.0和更高版本中,实际上有一种更好的方法来处理非托管资源的清理:SafeHandle。鉴于此,您几乎永远不必再编写终结器。
除非您的班级维护非托管资源(例如Windows文件句柄),否则您不需要一个。
它称为析构函数/终结器,通常是在实现Disposed模式时创建的。
当类的用户忘记调用Dispose来确保(最终)释放资源时,这是一个后备解决方案,但是您不能保证何时调用析构函数。
在这个Stack Overflow问题中,被接受的答案正确地显示了如何实现处置模式。仅当您的类包含垃圾处理器无法自行清理的任何未处理资源时,才需要使用此方法。
一个好的实践是在没有给类用户提供手动分配对象以立即释放资源的可能性的情况下,不要实现终结器。
析构函数提供了一种隐式方式来释放封装在您的类中的非托管资源,它们在GC到达时被调用,并且隐式调用基类的Finalize方法。如果您正在使用大量非托管资源,则最好提供一种明确的方式,通过IDisposable接口释放那些资源。请参阅C#编程指南:http : //msdn.microsoft.com/zh-cn/library/66x5fx1b.aspx