Provides a convenient syntax that ensures the correct use of IDisposable objects.
Example
The following example shows how to use the using statement.
C#
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
Remarks
File and Font are examples of managed types that access unmanaged resources (in this case file handles and device contexts). There are many other kinds of unmanaged resources and class library types that encapsulate them. All such types must implement the IDisposable interface.
As a rule, when you use an
IDisposable
object, you should declare and instantiate it in a using
statement. The using
statement calls the Dispose method on the object in the correct way, and (when you use it as shown earlier) it also causes the object itself to go out of scope as soon as Dispose is called. Within the using
block, the object is read-only and cannot be modified or reassigned.
The
using
statement ensures that Dispose is called even if an exception occurs while you are calling methods on the object. You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using
statement is translated by the compiler. The code example earlier expands to the following code at compile time (note the extra curly braces to create the limited scope for the object):
C#
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
Multiple instances of a type can be declared in a
using
statement, as shown in the following example.
C#
using (Font font3 = new Font("Arial", 10.0f),
font4 = new Font("Arial", 10.0f))
{
// Use font3 and font4.
}
You can instantiate the resource object and then pass the variable to the
using
statement, but this is not a best practice. In this case, the object remains in scope after control leaves the using
block even though it will probably no longer have access to its unmanaged resources. In other words, it will no longer be fully initialized. If you try to use the object outside the using
block, you risk causing an exception to be thrown. For this reason, it is generally better to instantiate the object in the using
statement and limit its scope to the using
block.
C#
Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
// use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight();
No comments:
Post a Comment