Pourquoi Dispose n’est pas appelé même avec using-statement?

J’ai cette application console (.NET Framework 4.5.2):

class Program { static void Main(ssortingng[] args) { using (var result = new Result()) { result.Test(); } } } public class Result : IDisposable { public void Test() { int a = 1; int b = 1 / (a - 1); } public void Dispose() { Console.WriteLine("Dispose"); } } 

Pourquoi la méthode Dispose n’est pas appelée? Un point d’arrêt n’est pas atteint dans Dispose après l’ DivideByZero DivideByZero et il n’y a pas de sortie sur la console (car l’application se ferme).

Selon MS Docs: try-finally (référence C #)

Dans une exception gérée, l’exécution du bloc finally associé est garantie. Toutefois, si l’exception n’est pas gérée, l’exécution du bloc finally dépend de la manière dont l’opération de dérogation d’exception est déclenchée. Cela dépend de la configuration de votre ordinateur.

Comme vous n’attrapez pas l’exception DivideByZero et ne la laissez pas non DivideByZero , sur votre DivideByZero et sur son installation, elle doit supprimer l’application avant que toute autre ligne de code ne soit exécutée et par conséquent, ne pas exécuter le bloc finally .

Comme @Evk l’a souligné dans le commentaire ci-dessous, si je l’exécute sans attacher le débogueur, les exceptions sont automatiquement supprimées et le bloc finally est exécuté. Apprenez quelque chose de nouveau tous les jours.

Selon la réponse d’Eric Lippert à Finally Block Not Running?

Réfléchissez à la gravité de cette situation: il s’est produit quelque chose d’inattendu que personne n’a jamais écrit de code à gérer. Est-ce la bonne chose à faire dans cette situation d’exécuter encore plus de code, qui n’était probablement pas non plus conçu pour gérer cette situation? Peut-être pas. Souvent, la bonne chose à faire ici est de ne pas essayer de gérer les blocages finaux, car cela aggraverait encore la situation. Vous savez déjà que le processus est en train de se terminer; mettez-le immédiatement hors de sa misère.

Dans un scénario où une exception non gérée va ralentir le processus, tout peut arriver. Ce qui se produit dans ce cas est défini par l’implémentation: si l’erreur est rapscope dans le rapport d’erreurs Windows, si un débogueur démarre, etc. Le CLR a parfaitement le droit d’essayer de lancer des blocs, mais il a également parfaitement le droit d’échouer rapidement. Dans ce scénario, tous les paris sont ouverts; différentes implémentations peuvent choisir de faire différentes choses.