3.29. Assuring an Object’s Disposal
Problem
You require a way to always have the
Dispose method of an object called when that
object’s work is done or it goes out of scope.
Solution
Use the
using statement:
using System;
using System.IO;
// ...
using(FileStream FS = new FileStream("Test.txt", FileMode.Create))
{
FS.WriteByte((byte)1);
FS.WriteByte((byte)2);
FS.WriteByte((byte)3);
using(StreamWriter SW = new StreamWriter(FS))
{
SW.WriteLine("some text.");
}
}Discussion
The using statement is very easy to use and saves
you the hassle of writing extra code. If the solution had not used
the using statement, it would look like this:
FileStream FS = new FileStream("Test.txt", FileMode.Create);
try
{
FS.WriteByte((byte)1);
FS.WriteByte((byte)2);
FS.WriteByte((byte)3);
StreamWriter SW = new StreamWriter(FS);
try
{
SW.WriteLine("some text.");
}
finally
{
if (SW != null)
{
((IDisposable)SW).Dispose( );
}
}
}
finally
{
if (FS != null)
{
((IDisposable)FS).Dispose( );
}
}There are several points about the using statement.
There is a
usingdirective, such asusing System.IO;
which should be differentiated from the
usingstatement. This is potentially confusing to developers first getting into this language.The variable(s) defined in the
usingstatement clause must all be of the same type, and they must have an initializer. However, you are allowed multipleusingstatements in front of a single code block, so this isn’t a significant restriction.Any variables defined in the
usingclause are considered ...