「オブジェクトの開放時に何かをしたい」という意味ならまさにそれがDisposeの使いどころ
自作クラスにIDisposableを実装すればDispose()でリソースを破棄できるし、using句で「スコープを抜けたら解放」という使い方もできる

C#にもデストラクタはあるけど、これはGCによる回収時に呼ばれるから、いつ呼ばれるかは不安定
処理し忘れを防ぐ程度の使い方はできるけど、基本的にはあまり使わない

マネージドなリソースしか持たないクラスならDisposeは要らない
var x = new Foo();
var y = new Bar(x);
のような場合でも、FooやBarがDisposeを必要としないならGCが適切に処理してくれるので、例えば「Barのデストラクタ内でFooをdeleteする」などの処理は書かなくてOK
どちらもGCが管理してくれる

C++から来た場合はこれを「管理しなくても解放し忘れが無くて安心」と思うか「解放のタイミングを制御できない 」と思うかは分かれるかもしれない
今でこそC++にはスマートポインタがあるけど、それ以前の生ポインタしかなかった頃を考えると、解放し忘れを防げるのはメリットとして大きい