.net under the covers — using/Using/use
Something I had occasion to look at the other day was exactly how the auto-disposal mechanism actually works for the out of the box .net languages: and there are some interesting quirks to be found. Take the equivalent sample code fragments
and for completeness, C++/CLI stack based disposal
All languages and configurations render this as a try {} finally { Dispose() }
construction (apart from stack-based C++/CLI semantics, which generates a try {} catch { Dispose(); throw;} Dispose()
), but there are devils in the details. In release mode, C# and VB compile to the same IL -- just dispose if the used value is not null
whereas F# compiles to
which is unexpected, as the compiler enforces the subject of a use
initialisation to be an IDisposable
anyway -- but, importantly, it does not test for null on the original reference.
In debug mode, all three languages differ, C# flips the test around
VB does something a bit more like F#
and F# just adds one of its usual bursts of gratuitous branching in the middle
The C++/CLI code can rely on the stack-based object not being null, so eschews any checks
No comments :
Post a Comment