It depends. C# .NET utilizes a garbage collector that implicitly cleans up objects for you. Normally, you cannot control the clean up of objects - the garbage collector does that. You can implement a destructor in your class if you desire, but you may get a performance hit. MSDN has this to say on destructors:
In general, C# does not require as much memory management as is needed
when you develop with a language that does not target a runtime with
garbage collection. This is because the .NET Framework garbage
collector implicitly manages the allocation and release of memory for
your objects. However, when your application encapsulates unmanaged
resources such as windows, files, and network connections, you should
use destructors to free those resources. When the object is eligible
for destruction, the garbage collector runs the Finalize method of the
object.
and finally on performance:
When a class contains a destructor, an entry is created in the
Finalize queue. When the destructor is called, the garbage collector
is invoked to process the queue. If the destructor is empty, this just
causes a needless loss of performance.
There are other ways to manage resources besides a destructor:
Cleaning Up Unmanaged Resources
Implementing a Dispose Method
using Statement (C# Reference)