> -----Original Message-----
> From: Jonathan Pryor [mailto:[EMAIL PROTECTED] 
>       class Test : IDisposable {
>               IDisposable nested;
> 
>               public void Dispose ()
>               {
>                       Dispose (true);
>               }
> 
>               ~Test ()
>               {
>                       Dispose (false);
>               }
> 
>               protected virtual void Dispose (bool disposing)
>               {
>                       if (disposing) {
>                               // safe to access members
>                               if (nested != null)
>                                       nested.Dispose ();
>                       }
>                       // Always deal with unmanaged members here.
>               }
>       }

This code isn't recallable which it needs to be.  You need a local
variable which gets checked.

public class T : IDispose {
        public void Dispose () {
                Dispose (true);
        }
        ~T () {
                Dispose (false);
        }
        private bool disposed = false;
        private void Dispose (bool disposing) {
                if (!disposed) { // make sure we only dispose once
                        if (disposing) {
                                // managed disposes
                        }
                        // unmanaged disposes
                }
                disposed = true;
        }
}

I'm not sure if this applies to Mono but there is also some issues if an
object is resurrected (via WeakReference f.e., see
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/h
tml/frlrfsystemweakreferenceclasstopic.asp)

Chris
_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to