1) Деструкторов в C# не существует, то что там ими обзывается есть финализаторы. Метод Dispose в совокупности с using - просто синтаксический сахар.

2) Ранжирование объектов по поколениям эффективно в случае когда есть большое количество долгоживущих (примерно 5'000'000) объектов на фоне которых то и дело создаётся и удаляется некое количество короткоживущих.