Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are the kind of variables that must be disposed? (.NET/Java)

Three questions:

  1. 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?

  2. 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?

  3. 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?

like image 353
Hari Menon Avatar asked Dec 06 '22 01:12

Hari Menon


2 Answers

This answer deals only with the .NET part of your question

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?

In .NET, all objects that implement IDisposable should be disposed explicitly (or used in a using block).

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?

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.

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?

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.Dispose method is only intended for resources that are not managed by the GC.


EDIT: as a side note, I would like to add that IDisposable is 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, IDbTransaction implements IDisposable in order to rollback the transaction if an exception occurs before the transaction was committed :

using (var trx = connection.BeginTransaction())
{
    // Do some work in the transaction
    ...

    // Commit
    trx.Commit();

} // the transaction is implicitly rolled back when Dispose is called
like image 108
Thomas Levesque Avatar answered Dec 09 '22 13:12

Thomas Levesque


In Java, you "close" rather than "dispose".

  • JDBC Connections, unless you got them from a pool.
  • JDBC ResultSets, depending on the JDBC connector.
  • InputStreams, OutputStreams, Readers and Writers (with the exception of those that are byte array and string backed).

Some third-party Java libraries or frameworks have classes that need to be manually disposed / closed / destroyed.

like image 30
Stephen C Avatar answered Dec 09 '22 15:12

Stephen C