Compartilhar via


Brain Teaser #3 Answer

If you haven't read the question yet, you can read it here.

The answer for this lies in the C# specification. Specifically, read section 8.13. There are two different ways you can use a using statement and in this case we are interested in the second way. The key words from the spec are "in this case ResourceType is implicitly the compile-time type of the expression, and the resource variable is inaccessible in, and invisible to, the embedded statement."

So effectively what the code in our question means is:

 Foo x;
using (/*y =*/ x = new Foo())
{
} // this calls y.Dispose();

In this example, y is effectively the copy of x that is made so that x becomes inaccessible and invisible to the embedded statement. If Foo is a reference type, you don't really see the difference because x and y point to the same type. However, if Foo is a value type, it is actually making a copy of the value and you're dealing with a completely different memory location.