Natürlich sollten wir Dispose() auf IDisposable-Objekte aufrufen, sobald wir sie nicht brauchen (was oft nur der Bereich einer "using" -Anweisung ist). Wenn wir diese Vorsichtsmaßnahme nicht ergreifen, können schlimme Dinge von subtil bis hin zum Anhalten passieren.Gibt es eine Zeit, IDisposable.Dispose zu ignorieren?
Aber was ist mit "der letzte Moment" vor Prozessbeendigung? Wenn Ihre IDisposables zu diesem Zeitpunkt noch nicht explizit entsorgt wurden, ist es nicht wahr, dass es nicht mehr zählt? Ich frage, weil nicht verwaltete Ressourcen unterhalb der CLR durch Kernel-Objekte repräsentiert werden - und die Win32-Prozessbeendigung wird sowieso alle nicht verwalteten Ressourcen/Kernel-Objekte freigeben. Anders gesagt, keine Ressourcen bleiben "geleakt", nachdem der Prozess beendet wurde (unabhängig davon, ob Dispose() bei der Verweildauer von IDisposables aufgerufen wurde).
Kann jemand an einen Fall denken, in dem eine Prozessbeendigung immer noch eine ausgelaufene Ressource hinterlassen würde, einfach weil Dispose() nicht explizit für ein oder mehrere IDisposables aufgerufen wurde?
Bitte missverstehen Sie diese Frage nicht: Ich versuche nicht, IDisposables zu ignorieren. Die Frage ist nur technisch-theoretisch.
EDIT: Und was ist mit Mono unter Linux? Ist Prozessabbruch dort genauso "zuverlässig" bei der Bereinigung von nicht verwalteten "Lecks"?
LATE EDIT: Obwohl "andere Verwendungen" für IDisposables vorhanden sein können, liegt mein Fokus ausschließlich auf Ressourcenlecks. Ich habe zwei Antworten gehört: (1) Wenn Ihr Prozess sich weigert, zu beenden, haben Sie ein Leck und (2) ja, Ressourcen können sogar auslaufen, selbst wenn der Prozess endet. Ich stimme sicherlich mit Punkt (1) überein, obwohl es gerade außerhalb des Umfangs dessen, was ich suche, liegt. Ansonsten ist Punkt (2) genau das, wonach ich suche, aber ich kann das Gefühl nicht abschütteln, dass es nur eine Vermutung ist. Jeffrey Richter ("Windows via C/C++") erklärt, dass ein (ordnungsgemäß) beendet Win32-Prozess keine durchgesickerten oder verwaisten Ressourcen verlassen wird. Warum sollte ein Prozess, der die CLR enthält, dies ändern? Wo ist die Dokumentation, das spezifische Beispiel oder das theoretische Szenario, das der Idee, dass die Win32-Prozessbereinigungsfunktion bei der Verwendung der CLR gefährdet ist, Glaubwürdigkeit verleiht?
Der Finalizer ist immer da, um sich um nicht verwaltete Ressourcen zu kümmern, die nicht entsorgt wurden. Und wenn es nicht läuft, hast du das Betriebssystem, um den Schrapnell zu säubern. –