Alternative to Directory.GetFiles and co. (2)


Andy Rich did spot a bug in my code and pointed to his related The long-awaited return of DF blog entry:


Reset() does not delete _win32FindData, so when Dispose is invoked on this class, it will not be deleted – only when the class is finalized.  That is, when Dispose is invoked, your finalizer is not called, but GC::SuppressFinalize(this) is.  You need to explicitly call !FilesEnumerator() from your destructor in order for it to be run when Disposing. 



An interesting difference between C++/CLI and C# – one that users familiar with C# may not be well aware of.


 


I had forgotten that behaviour so I fired .NET Reflector to verify and indeed:


 


public sealed override void Dispose()


{


      this.Dispose(true);


      GC.SuppressFinalize(this);


}


 


protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)


{


      if (flag1)


      {


            this.~FilesEnumerator();


      }


      else


      {


            try


            {


                  this.!FilesEnumerator();


            }


            finally


            {


                  base.Finalize();


            }


      }


}


 


protected override void Finalize()


{


      this.Dispose(false);


}


 


I will update the original blog entry to fix this. 


Thanks Andy!

Comments (0)