What does the tilde before a function name mean in C#?
Asked Answered
H

6

189

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.

Hilltop answered 9/10, 2008 at 19:0 Comment(0)
T
237

~ is the destructor

  1. Destructors are invoked automatically, and cannot be invoked explicitly.
  2. Destructors cannot be overloaded. Thus, a class can have, at most, one destructor.
  3. Destructors are not inherited. Thus, a class has no destructors other than the one, which may be declared in it.
  4. Destructors cannot be used with structs. They are only used with classes. An instance becomes eligible for destruction when it is no longer possible for any code to use the instance.
  5. Execution of the destructor for the instance may occur at any time after the instance becomes eligible for destruction.
  6. When an instance is destructed, the destructors in its inheritance chain are called, in order, from most derived to least derived.

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 objects 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 to 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.

Tharp answered 9/10, 2008 at 19:5 Comment(4)
I don't know how it used to be in the past. But now destructors are inherited. Check this link for more information (check the example at the end): msdn.microsoft.com/en-us/library/66x5fx1b.aspxGorgon
@Gorgon point 3 of the very page you link to states "Finalizers cannot be inherited", which contradicts your comment. It's admittedly all a bit confusing because while they can't be inherited, "the Finalize method is called recursively for all instances in the inheritance chain, from the most-derived to the least-derived". Note that that's not the same behaviour you'd get from inheritable destructors, though.Aerostation
@MarkAmery ah I see, so basically they get called in the reversed order compared to something that is inherited?Gorgon
So if some C# code that is the result of a decompiler has a method like this, it can safely be deleted? This seems to be confirmed by the fact that it has 0 referencesDefense
T
46

This is a finalizer. To be honest, you should very rarely need to write a finalizer. You really only need to write one if:

  • You have direct access to an unmanaged resource (e.g. through an IntPtr) and you can't use SafeHandle which makes it easier
  • You are implementing IDisposable 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.
Their answered 9/10, 2008 at 19:4 Comment(0)
P
9

It is used to indicate the destructor for the class.

Pervade answered 9/10, 2008 at 19:2 Comment(2)
They're both correct, depending on which C# spec you read. The most recent MS one (unified C# 3.0) refers to them as destructors (e.g. section 10.13) but the ECMA spec refers to them as finalizers.Their
@1800INFORMATION: The syntactic element is properly called a destructor. If a class has a destructor, a C# compiler will auto-generate a finalizer which includes a generally-useless try/finally block that ensures that the parent Finalize method gets called. Most things that are true of destructors are true of finalizers, and vice versa, but the words mean slightly different things.Falgoust
A
5

Same as C++, it is the destructor; however in C# you do not call it explicitly, it is invoked when the object gets collected by the garbage collector.

Australian answered 9/10, 2008 at 19:2 Comment(0)
P
3

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.

Personage answered 9/10, 2008 at 19:10 Comment(0)
R
0

~ usually represents a deconstructor. which is run right before a object dies.

Here is a description of C# deconstructors i found

Rhodos answered 9/10, 2008 at 19:2 Comment(1)
the correct term should be destructor/finalizer, not deconstructor. Deconstructor means a syntax to deconstruct a constructor.Lara

© 2022 - 2024 — McMap. All rights reserved.