Using blocks are new to us VB developers. I get the basic concept - it's
cleaner than try/catch/finally blocks when all you are doing is disposing an
object and it's super great when dealing with unmanaged resources and good ol'
SqlConnections.
But the intricacies of using it are a little less obvious. Luckily, this code
construct has been around in C# (and I will guess C++??) so we can learn from
those folks.
I was trying to find a better way to deal with a file stream and memory
stream today. Porting some code over from vs2003 to vs2005, the compiler was
moaning about the following code block (I am only writing it loosely here...)
where I am passing in a file name, opening up the file into a streamReader and
then doing something to the streamreader and then closing both objects at the
end. Maybe it wasn't written perfectly to begin with, but the compiler issue was
a new one.
dim fs as new
FileStream(myfilename,FileMode.Open)
dim sr as new StreamReader
Try
myStreamReader=new
StreamReader(fs)
... do some stuff
Catch exS as IOException
... do
something
Catch ex as Exception
.. do
something
Finally
If Not fs is nothing
then
fs .Close
EndIf
If Not sr is Nothing
then
sr.Close
End
If
End Try
So when I ported this to VS2005, the compiler was not happy about accessing
the streamReader in the Finally block because it was possible that no value
would be assigned and I'd get a null ref exception (on the bold red line.)
I knew that I could get rid of those Close methods with a using block but was
not sure if nesting them was a) possible b) good code or c) something that would
bite me in the rear down the road.
Once I figured out what I was dealing with: "nested using blocks" I quickly
found this
blog post by Scott Hanselman, who specifically says in the comments of this
post that he is thumbs up with "nested using blocks (but ONLY if theare are
pure nestings without any other code following the inner block."
So, considering the source, I'm confident that I'm doing good by doing well
(or however that goes) with nested using blocks (with out extra code after the
inner block). 
Using fs as New
FilesStream(myfilepath,FileMode.Open)
Using sr as new
streamReader(fs)
Try
... still
need exception handling around the other code
catch
....
Finally
End Try
End
Using
End Using
Don't Forget: www.acehaid.org