I asked a question regarding returning a Disposable (IDisposable
) object from a function, but I thought that I would muddle the discussion if I raised this question there.
I created some sample code:
class UsingTest
{
public class Disposable : IDisposable
{
public void Dispose()
{
var i = 0;
i++;
}
}
public static Disposable GetDisposable(bool error)
{
var obj = new Disposable();
if (error)
throw new Exception("Error!");
return obj;
}
}
I coded it this way deliberately, because then I call:
using (var tmp = UsingTest.GetDisposable(true)) { }
Using the debugger, I notice that the Dispose
method never executes, even though we've already instantiated a Disposable
object. If I correctly understand the purpose of Dispose
, if this class actually had opened handles and the like, then we would not close them as soon as we had finished with them.
I ask this question because this behavior aligns with what I would expect, but in the answers to the related question, people seemed to indicate that using
would take care of everything.
If using
still somehow takes care of all of this, could someone explain what I'm missing? But, if this code could indeed cause resource leak, how would you suggest I code GetDisposable
(with the condition that I must instantiate the IDisposable
object and run code which could throw an exception prior to the return statement)?