Q:

Native resource cleanup and Not calling Dispose

Can anyone explain why not calling Dispose() explicitly, and native resource still gets cleaned up. Does it get called implicitly?
I came cross below

calling Dispose is not required to guarantee native resource cleanup.
  Native  resource cleanup will always happen eventually; calling
  Dispose lets you control when that cleanup  happens.

  // Create the bytes to write to the temporary file.  
  Byte[] bytesToWrite = new Byte[] { 1, 2, 3, 4, 5 };  

  // Create the temporary file.  
  FileStream fs = new FileStream("Temp.dat", FileMode.Create);  

  // Write the bytes to the temporary file.  
  fs.Write(bytesToWrite, 0, bytesToWrite.Length);  

  // Explicitly close the file when finished writing to it.  
  //fs.Dispose();

Dispose should be called explicitly in code within finally block or via using statement.

A:

FileStream contains Finalize method which calls Dispose inside:
~FileStream()
{
    if (_handle != null) {
        BCLDebug.Correctness(_handle.IsClosed, "You didn't close a FileStream & it got finalized.  Name: \""+_fileName+"\"");
        Dispose(false);
    }
}

Which means it will be eventually called by Finalizer when the object will not be longer reachable. Of course, it is good to call Dispose explictly as it let's you control cleanup deterministicaly as you've mentioned.

