Verständnis Einweg-Objekte
Ist, habe ich mich SO über eine Frage wie diese, und sogar die, die ich gefunden habe schon ein paar, alle diese warf kein Licht in diese Angelegenheit für mich.
Nehmen wir an ich habe diesen code:
public class SuperObject : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) { }
}
- Brauche ich die
protected virtual void Dispose(bool)
aufSuperObject
? Da gibt es wirklich nichts zu entsorgen gibt.
public interface ICustom : IDisposable { }
public class Custom : ICustom
{
public SuperObject Super { get; protected set; }
public Custom()
{
Super = new SuperObject();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public virtual void Dispose(bool disposing)
{
if (!disposing) return;
if (Super != null)
Super.Dispose();
}
}
public class Foo
{
public Foo()
{
using (var c = new Custom())
{
//do magic with c
}
}
}
Nun, was passiert, wenn ich wollen/müssen/versuchen Custom
auf eine Klasse wie System.Web.Mvc.Controller
die bereits implementiert und implementiert IDisposable?
public class Moo : Controller
{
Custom c;
public Moo()
{
c = new Custom();
}
//Use c throughout this class
}
, Wie man richtig entsorgen c
im Moo
?
Wenn es nichts zu Entsorgen, nicht implementieren IDisposable.
Warum verwenden Sie
das ist eine gute Frage, vielleicht könntest du hier Hilfe: stackoverflow.com/q/19078536/544283.
Warum verwenden Sie
GC.SuppressFinalize()
wenn Sie noch nicht Finaizer?das ist eine gute Frage, vielleicht könntest du hier Hilfe: stackoverflow.com/q/19078536/544283.
InformationsquelleAutor Esteban | 2013-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die normale Haltung ist, die standard IDispoable Umsetzung - ALLERDINGS ist dies wirklich nur notwendig, wenn Ihre Klasse oder einige Klassen, die sich aus wird, verwenden Sie nicht verwaltete Ressourcen - diesem Fall ist in der Tat SEHR selten (und wenn dies der Fall gilt es besser ist, wickeln Sie die nicht verwaltete Ressource in einer eigenen Klasse, die eine vollständige standard IDisposable-Implementierung).
Vorausgesetzt, Sie sind nicht der Umgang mit nicht verwalteten Ressourcen (raw-Datei verarbeitet, Global alloced memeory etc) und sind nur den Umgang mit den Mitgliedern, sind Einweg - (ich.e, die es geschafft haben, Ressourcen und implementieren Sie IDisposable), dann können Sie sicher Holen Sie sich einen Weg mit einem mimimal Umsetzung der IDispose - das heißt:
Nur einen einzigen void Dispose () - Methode. In dieser Methode rufen Sie dispose auf dispoable Mitglieder und dann Entsorgen auf der Basis Klasse, wenn seine Einweg. Wenn Sie eine Klasse Hierarchie sein ok, um diese zu Entsorgen virtuellen. Es gibt keine Notwendigkeit, einen Dispose(bool) - Methode. Noch gibt es keine Notwendigkeit zu prüfen, ob das Objekt angeordnet ist, - weil alles, was Ihr tut, ruft dipsose auf andere Gegenstände und solche Umsetzung wird dies überprüfen.
Wenn Sie nicht wie die mimimal Programm dann gelten die standard, die vollständige Umsetzung (aber nicht zwingend erforderlich). I. e entweder eine standard-implimentation, weil Ihr ein Verfechter für die folgenden empfohlenen Ansatz ODER eine einfache minimal (aber korrekte) Umsetzung - aber nicht etwas dazwischen (ich.e nicht-standard, nicht einfach oder nicht richtig)!
Sehen, diese Frage für mehr details: Minimal IDispose implimenation für verwaltete Ressourcen nur
Also in deinem Fall die folgende ist die mimimal Umsetzung:
Beachten Sie, dass, wenn Super-Objekt keine Wegwerf-Ressourcen, dann gibt es keinen Punkt in der IDisposable implementiert, und dass eine Dispose-Methode. Wenn der Zoll nur Einweg-Objekt ist SuperObject dann das gleiche gilt dort, und immer wieder die gleiche Logik Felsen durch zu Moo. Schließlich dann, wenn alle der oben genannten gilt und es gibt keine andere Einweg-Objekte, um alles, was Sie brauchen wirklich brauchen, ist:
InformationsquelleAutor Ricibob
Ist und dass auch die Antworten deiner ersten Frage,
Controller
braucht, um seineDispose(bool)
Methodeprotected virtual
oder die oben genannten nicht möglich wäre.Aber ein paar Anmerkungen:
isDisposed
Logik. Es ist eine gute Idee, um die Entsorgung nur einmal, und möchten Sie vielleicht, um trap-Nutzung-nach-entsorgen.InformationsquelleAutor Henk Holterman