Avoir de destructeur (~Object()) dans la gestion de langage de programmation est le plus dummest idée.
C'est parfaitement logique pour non géré langages comme C,C++ pour avoir des destructeurs, car ils utilisent de l'idiome RAII mais pour géré comme Java,C#, tellement absurde.
Il a été souligné par Joshua Bloch, ancien chef de projet en Java Cadre de Collecte, que l'idée de la méthode finalize () (ce qui est équivalent à C#, C++ comme destructeur) en Java a été la plus grande erreur jamais fait. Même que C#, finallize() en Java, donne de frais généraux pour les "nouveaux" comme il doit être ajouté à la finallizer file d'attente lors de l'allocation. De plus, le Collecteur d'Ordures doivent pop et exécuter finallize() dans la file d'attente, donc deux fois les frais généraux au cours de gc.
C# a beaucoup de fonctionnalités améliorées comme "à l'aide de(IDisposable) {}", qui permettent non seulement la IDisposable variable à être confiné à la portée de "l'aide", mais aussi de garantir que c'est le nettoyage.
Ma question est, pourquoi C# suivre le même sentier de Java, qui conduisent à une grande erreur.
Peut-être si le développement de dotnet commencé après 2003 ~ 2005, lorsque de nombreux architectes Java trouvé l'erreur de finallize(), alors l'erreur aurait été empêché.
Beaucoup de bonnes idée d'une langue est souvent transférés à d'autres langues comme le "IDisposable/à l'aide de combo" en C# qui a été transférée à Java 1.7, dans son "essai(objet-à-jeter) {}". Mais ses dommage que la langue architectes manquera pas de découvrir la mauvaise idée déguisée comme une bonne idée au cours de son transfert de l'un à l'autre.
Mon conseil est de ne jamais utiliser d' ~Destructeur() et le bâton avec IDisposable/à l'aide de combo si vous devez manuellement le nettoyage de la ressource non managée comme des connexions de base de données.