オブジェクトのデストラクタが呼び出される時間を参照している場合、それはガベージコレクターであり、プログラミングはそれにほとんど影響を与えない可能性があり、言語定義によれば、それは明示的に非決定的です。
IDisposable.Dispose()の呼び出しを参照している場合、それはIDisposableインターフェースを実装するオブジェクトの動作に依存します。
一般に、呼び出し元のコードにとって重要である場合を除いて、ほとんどのFrameworkオブジェクトでは順序は重要ではありません。ただし、オブジェクトAがオブジェクトBへの依存関係を維持し、オブジェクトBが破棄される場合、オブジェクトAで特定のことを行わないことが非常に重要になる可能性があります。
ほとんどの場合、Dispose()は直接呼び出されませんが、usingまたはforeachステートメントの一部として暗黙的に呼び出されます。この場合、ステートメントの埋め込みに従って、逆順のパターンが自然に出現します。
using(Foo foo = new Foo())
using(FooDoodler fooDoodler = new FooDoodler(foo))
{
// do stuff
// ...
// fooDoodler automatically gets disposed before foo at the end of the using statement.
}