ECMA-334 C# Language Specification15.13: The using statement |
The using statement obtains one or more resources, executes a statement, and then disposes of the resource.
(
resource-acquisition
)
embedded-statement
local-variable-declaration
expression
A resource is a class or struct that implements System.IDisposable, which includes a single parameterless method named Dispose. Code that is using a resource can call Dispose to indicate that the resource is no longer needed. If Dispose is not called, then automatic disposal eventually occurs as a consequence of garbage collection.
If the form of resource-acquisition
is local-variable-declaration
then the type of the local-variable-declaration
must be System.IDisposable or a type that can be implicitly converted to System.IDisposable. If the form of resource-acquisition
is expression then this expression must be System.IDisposable or a type that can be implicitly converted to System.IDisposable.
Local variables declared in a resource-acquisition
are read-only, and must include an initializer. A compile-time error occurs if the embedded statement attempts to modify these local variables (via assignment or the ++ and --operators) or pass them as ref or out parameters.
A using statement is translated into three parts: acquisition, usage, and disposal. Usage of the resource is implicitly enclosed in a try statement that includes a finally clause. This finally clause disposes of the resource. If a null resource is acquired, then no call to Dispose is made, and no exception is thrown.
A using statement of the form
using (R r1 = new R()) { r1.F(); } |
R r1 = new R(); try { r1.F(); } finally { if (r1 != null) ((IDisposable)r1).Dispose(); } |
A resource-acquisition
may acquire multiple resources of a given type. This is equivalent to nested using statements. A using statement of the form
using (R r1 = new R(), r2 = new R()) { r1.F(); r2.F(); } |
using (R r1 = new R()) using (R r2 = new R()) { r1.F(); r2.F(); } |
R r1 = new R(); try { R r2 = new R(); try { r1.F(); r2.F(); } finally { if (r2 != null) ((IDisposable)r2).Dispose(); } } finally { if (r1 != null) ((IDisposable)r1).Dispose(); } <table_line></table_line> |