[Mono-bugs] [Bug 539345] New: using-statement fails to call Dispose(), instead allocates new instance and disposes that

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Tue Sep 15 13:04:55 EDT 2009


http://bugzilla.novell.com/show_bug.cgi?id=539345


           Summary: using-statement fails to call Dispose(), instead
                    allocates new instance and disposes that
    Classification: Mono
           Product: Mono: Compilers
           Version: 2.4.x
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Major
          Priority: P5 - None
         Component: C#
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: oskar.berggren at gmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---


User-Agent:       Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.14)
Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14

In the following code, there are exactly two occurrences of "new Foo()". Yet
three instances are created, of which only two are disposed! If I'm not missing
anything, this seems like a rather serious bug, only mitigated by the fact that
it is probably quite rare to have using(IDisposable a = ...). Such code does
occur when using Rhino.Mocks for unit tests.

Code and output below:

using System;

namespace IDisposableTest
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            using (Foo f = new Foo())
                ;

            Console.WriteLine("Between. Foo.TotalInstances = " +
Foo.TotalInstances);

            using (IDisposable f = new Foo())
                ;

            Console.WriteLine("After. Foo.TotalInstances = " +
Foo.TotalInstances);
        }
    }


    class Foo : IDisposable
    {
        public static int TotalInstances = 0;

        private int my_a = 0;

        public Foo()
        {
            my_a = TotalInstances++;
            Console.WriteLine("Instance " + my_a + " ctor");
        }

        public void Dispose()
        {
            Console.WriteLine("Instance " + my_a + " Dispose()");
        }
    }

}


Output:
Instance 0 ctor
Instance 0 Dispose()
Between. Foo.TotalInstances = 1
Instance 1 ctor
Instance 2 ctor
Instance 2 Dispose()
After. Foo.TotalInstances = 3


Reproducible: Always

-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list