Howdy,
I am looking at some code and it has this statement:
~ConnectionManager()
{
Dispose(false);
}
The class implements the IDisposable interface, but I do not know if that is part of that the tilde(~) is used for.
Thank you,
Keith
Howdy,
I am looking at some code and it has this statement:
~ConnectionManager()
{
Dispose(false);
}
The class implements the IDisposable interface, but I do not know if that is part of that the tilde(~) is used for.
Thank you,
Keith
Same as C++, it's the destructor; however in C# you don't called it explicitely, it is invoked when the object gets collected.
~ usually represents a deconstructor. which is run right before a class dies.
This is a finalizer. To be honest, you should very rarely need to write a finalizer. You really only need to write one if:
IntPtr
) and you can't use SafeHandle
which makes it easierIDisposable
in a class which isn't sealed. (My preference is to seal classes unless they're designed for inheritance.) A finalizer is part of the canonical Dispose pattern in such cases.~ is the destructor
Finalize
In C#, the Finalize method performs the operations that a standard C++ destructor would do. In C#, you don't name it Finalize -- you use the C++ destructor syntax of placing a tilde ( ~ ) symbol before the name of the class.
Dispose
It is preferable to dispose of them in a Close() or Dispose() method that can be called explicitly by the user of the class. Finalize (destructor) are called by the GC.
The IDisposable interface tells the world that your class holds onto resources that need to be disposed and provides users a way to release them. If you do need to implement a finalizer in your class, your Dispose method should use the GC.SuppressFinalize method to ensure that finalization of your instance is suppressed.
What do use?
It is not legal to call a destructor explicitly. Your destructor will be called by the garbage collector. If you do handle precious unmanaged resources (such as file handles) that you want to close and dispose of as quickly as possible, you ought to implement the IDisposable interface.
See Destructors (C# Programming Guide). Be aware, however that, unlike C++, programmer has no control over when the destructor is called because this is determined by the garbage collector.
One point on the Finalizer above, on the situation you may need to call it. You need them to release unmanaged resources, which are more common than you'd think, usually for databases. SQLConnection is an example on which you should always call Dispose() when you're done with it.
One article: http://www.codeproject.com/KB/cs/idisposable.aspx