<p>In C#, if I want to deterministically clean up non-managed resources, I can use the "using" keyword.  But for multiple dependent objects, this ends up nesting further and further:</p>

<pre><code>using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
{
    using (BufferedStream bs = new BufferedStream(fs))
    {
        using (StreamReader sr = new StreamReader(bs))
        {
            // use sr, and have everything cleaned up when done.
        }
    }
}
</code></pre>

<p>In C++, I'm used to being able to use destructors to do it like this:</p>

<pre><code>{    
    FileStream fs("c:\file.txt", FileMode.Open);
    BufferedStream bs(fs);
    StreamReader sr(bs);
    // use sr, and have everything cleaned up when done.
}
</code></pre>

<p>Is there a better way in C# to do this?  Or am I stuck with the multiple levels of nesting?</p>

The using statement is syntactic sugar that converts to:
```
```
try
   {
      obj declaration
      ...
   }
   finally
   {
      obj.Dispose();
   }
```
```
You can explicitly call Dispose on your objects, but it won't be as safe, since if one of them throws an exception, the resources won't be freed properly.