Если вы имеете в виду время, когда вызывается деструктор для объектов, то это сборщик мусора, программирование может иметь очень небольшое влияние на это, и это явление недетерминированное, согласно определению языка.
Если вы имеете в виду вызов 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.
}