Mit relativ wenigen Ausnahmen (von denen die meisten als die am wenigsten schädlichen Ansätze zum Umgang mit schlecht entworfenem Code beschrieben werden können, die nicht geändert werden können), sollte jede Instanz zu genau einem Zeitpunkt genau eine Instanz haben wohldefinierter Besitzer. In Fällen, in denen eine Methode einen Typ zurückgibt, der IDisposable
implementiert, gibt der Vertrag für die Methode an, ob die Methode den Besitz aufgibt (in diesem Fall sollte der Aufrufer sicherstellen, dass das Objekt entsorgt wird) den Besitz an jemand anderen abzugeben), oder ob die Methode lediglich einen Verweis auf ein Objekt zurückgibt, das einer anderen Person gehört.
In ordnungsgemäß geschriebenen Code ist die Frage, ob ein Objekt entsorgt werden sollte ist selten ein Urteilsspruch. Der Eigentümer eines Objekts sollte sicherstellen, dass es entsorgt wird; niemand sonst sollte es entsorgen. Gelegentlich kann es erforderlich sein, dass eine Methode einen Parameter akzeptiert, der angibt, ob die Methode den Besitz einer IDisposable
übertragen soll. Zum Beispiel, wenn der Code einen Sound erzeugen will, ihn an eine "start playing sound" -Methode weitergibt, und sich nie wieder mit diesem Sound beschäftigen will, ist es am einfachsten den Code zu haben, um den Sound accept zu übernehmen und zu entsorgen klingen, wenn es fertig ist; Wenn der Code jedoch wiederholt einen Ton abspielen und sicherstellen möchte, dass das Klangobjekt so lange am Leben bleibt, wie es benötigt wird, wäre es praktischer, wenn der Klangcode nicht übernehmen würde. Die Verwendung separater Methoden kann in gewisser Weise sauberer sein, aber die Verwendung eines Parameters kann die Kapselung unterstützen.
Im Allgemeinen, wenn der Code eine Liste von Objekten zurückgibt, die IDisposable
, der Zweck des Codes implementieren zu Objekte identifizieren, ohne in ihnen jede Beteiligung zu vermitteln. In Abwesenheit eines Eigentumsrechts sollte Code, der solch eine Liste empfängt, nicht Anruf Dispose
auf ihm sein.
Es gibt keine Möglichkeit für den "Ersteller", sie oder Teile in diesen Klassen zu entsorgen, da es keinen Destruktor gibt. Sie haben keine Kontrolle darüber, dass Sie eine Variable auf nichts setzen, um dann das Objekt oder den Inhalt, der entsorgt werden muss, zu entsorgen. – OneFineDay
Sicher, Sie können für Process.GetProcesses() ein internes Array aller Process() -Objekte behalten, die Sie jemals an Aufrufer zurückgegeben haben, und dann regelmäßig überprüfen, ob Sie der einzige sind, der einen Verweis auf das Objekt hat Dispose() – Denis
@Denis Das Bestimmen, ob jemand anderes einen Verweis darauf hat, ist nicht etwas, was Sie tatsächlich tun können. – Servy