Por que devemos chamar SuppressFinalize quando não temos um destruidor

Tenho poucas perguntas para as quais não consigo obter uma resposta adequada.

1) Por que devemos chamar SuppressFinalize na função Dispose quando não temos um destruidor.

2) Dispose e finalize são usados para liberar recursos antes que o objeto seja coletado como lixo. Seja um recurso gerenciado ou não gerenciado, precisamos liberá-lo, então por que precisamos de uma condição dentro da função dispose, dizendo pass 'true' quando chamamos essa função substituída de IDisposable: Dispose e pass false quando chamado de um finalize.

Veja o código abaixo que eu copiei da net.

class Test : IDisposable
   {
     private bool isDisposed = false;

     ~Test()
     {
       Dispose(false);
     }

     protected void Dispose(bool disposing)
     {
       if (disposing)
       {
         // Code to dispose the managed resources of the class
       }
       // Code to dispose the un-managed resources of the class

       isDisposed = true;
     }

     public void Dispose()
     {
       Dispose(true);
       GC.SuppressFinalize(this);
     }
   }

e se eu remover a função Dispose protegida booleana e implementar a como abaixo.

   class Test : IDisposable
   {
     private bool isDisposed = false;

     ~Test()
     {
       Dispose();
     }


     public void Dispose()
     {
      // Code to dispose the managed resources of the class
      // Code to dispose the un-managed resources of the class
      isDisposed = true;

      // Call this since we have a destructor . what if , if we don't have one 
       GC.SuppressFinalize(this);
     }
   }       

questionAnswers(5)

yourAnswerToTheQuestion