Three questions:
-
What kind of variables should be disposed manually in .NET/Java? I know that SqlConnection should always be either disposed manually or used in a using{} block. Is it right? What are the other kind of variables that should be disposed?
-
I read somewhere that unmanaged code must be disposed manually. Is that right? What exactly is unmanaged code and how do I know if a variable is managed or unmanaged?
-
Finally, how do I dispose variables? I know that the Dispose() method does not really dispose a variable. So what does Dispose() do? Should I set them to null()? What is the logic by which the garbage collector works?
This answer deals only with the .NET part of your question
In .NET, all objects that implement
IDisposableshould be disposed explicitly (or used in ausingblock).You probably mean unmanaged resources, as code can’t be disposed… All classes that use unmanaged resources (memory allocated not on the managed heap, win32 handles…) should implement
IDisposable, and should be disposed explictly, since they are not managed by the garbage collector.I’m not sure I understand your question… you don’t dispose a variable, it is managed by the garbage collector. All managed memory is automatically released when it’s not used anymore (i.e. it is not accessible by code because there are no references left to it). The
IDisposable.Disposemethod is only intended for resources that are not managed by the GC.EDIT: as a side note, I would like to add that
IDisposableis primarily intended to clean-up unmanaged resources, but is also frequently used to perform other cleanup actions and guarantee state or data integrity. For instance,IDbTransactionimplementsIDisposablein order to rollback the transaction if an exception occurs before the transaction was committed :