>>760
解放が必要なリソースを持つクラスは IDisposable というインターフェースを継承してて、それが Dispose() メソッドを持つ
IDisposableなものはusingを使うことで「スコープを抜けたらリソース破棄」という書き方ができる
詳しくはマイクロソフトの解説
https://learn.microsoft.com/ja-jp/dotnet/standard/garbage-collection/using-objects

IDisposableなものは原則的に必ずDisposeを呼ぶべき
GCはこれらの面倒を見ないので「解放のタイミングが不安定になる」ではなく「解放されない」動きになる

逆にIDisposableでないものはDisposeメソッドを持たない
だからもし「C#のクラスは破棄が必要なものとそうでないものがある → 安全のためにとりあえず全て Dispose を呼ぶようにしよう」という考えをしたなら、それはちょっと違う