Search code examples
c#disposeusing

Is there a situation in which Dispose won't be called for a 'using' block?


This was a telephone interview question I had: Is there a time when Dispose will not be called on an object whose scope is declared by a using block?

My answer was no - even if an exception happens during the using block, Dispose will still be called.

The interviewer disagreed and said if using is wrapped in a try-catch block then Dispose will not be called by the time you enter the catch block.

This goes contrary to my understanding of the construct, and I haven't been able to find anything that backs up the interviewers point of view. Is he correct or might I have misunderstood the question?


Solution

  • void Main()
    {
        try
        {
            using(var d = new MyDisposable())
            {
                throw new Exception("Hello");
            }
        }
        catch
        {
            "Exception caught.".Dump();
        }
    
    }
    
    class MyDisposable : IDisposable
    {
        public void Dispose()
        {
            "Disposed".Dump();
        }
    }
    

    This produced :

    Disposed
    Exception caught
    

    So I agree with you and not with the smarty interviewer...