>>744
Disposeしないと解放されないリソースはDisposeしないとダメ
それ以外は基本的にGC任せで良い

var x = new Foo();
のようにして確保されたオブジェクトはGCが面倒を見る
C++のように delete x; を呼んでないからオブジェクトが破棄されずリークする、なんてことはない

var x = new Foo();
x = new Foo();
x = new Foo();
のようにすればオブジェクトは多数生成されるけど、それは再代入時でなく、GCが要らないと判断したタイミングで回収される
(GCが走るまでメモリ使用量が増え続けるという意味でもある)

アンマネージドなリソース、例えば開いたファイルのハンドルみたいなものはGC任せにできない
仮にファイルハンドルがオブジェクトの寿命に紐付いていると、使い終わったファイルがいつ閉じられるのかが分からない (GCのタイミングに依存する) なんてことになる
そういう制約があるので、明示的な破棄が必要なリソースを持つクラスについては Dispose を呼ぶ (あるいはusing句を使って使用期間を限定する) 必要がある

仮にC#のクラスが内部的にCのライブラリを呼んでおり、その中で多量のメモリを確保するような場合だと、Disposeしないと多量のメモリが破棄されないままになりリークする