2017-02-20 2 views
1

Ich habe eine IDisposable Klasse A. Ich muss ein Objekt von A innerhalb einer anderen Methode M der Klasse B verwenden. Methode M wird mehrmals aufgerufen (Millionen mal pro Tag)). Sollte ich das lokale Objekt von A innerhalb von M verwenden und einmal disponieren oder sollte ich ein statisches Mitglied auf Klassenebene in B deklarieren und entsorgen, sobald die Anwendung endet. Lassen Sie mich wissen, wenn ich nicht klar bin.Ein Objekt für die gesamte Anwendungslebensdauer oder ein Objekt pro Aufruf + dispose

+0

Warum kann B nicht eine A-Instanz in seinem Konstruktor verwenden und sie bei Bedarf an M liefern, und dann kann B sie zerstören, wenn sie damit fertig ist? Ein Objekt ist verantwortlich für die Bereinigung von Ressourcen, die es über die öffentliche Schnittstelle bereitstellt, es sei denn, diese Schnittstelle ist eine Factory-Methode oder ein Konstruktor, in welchem ​​Fall der Aufrufer verantwortlich ist. – hoodaticus

+0

Jeder Aufruf von M ist durch neue Instanz von B. –

+1

Sounds wie Singleton ist hier angebracht, vorausgesetzt, es ist Thread sicher. – hoodaticus

Antwort

1

Ein Objekt für die Lebensdauer der Anwendung ist ein Singleton; Während sie unter bestimmten Umständen nützlich sind, sind sie im Allgemeinen keine gute Idee. Eine genaue Erläuterung des Grundes finden Sie unter this question.

Klassen, die IDisposable implementieren, werden am besten innerhalb der Grenzen einer using Anweisung verwendet, die sich darum kümmert, sie für Sie zu entsorgen.

Die eindeutige Ausnahme ist, wenn mehrere Aufrufe der Disposable-Klasse im Kontext einer einzelnen Geschäftsaktion benötigt werden - und diese Aktion zu weit verbreitet ist, um in eine using-Anweisung eingebettet zu werden. In diesem Fall werden alle Aufrufe in eine zweite wegwerfbare Klasse verpackt, die die erste als privates Mitglied hat. Wenn die zweite Klasse entsorgt wird, sollte sie über private Mitglieder verfügen, die wegwerfbar sind.

+0

Aufrufe an Methode M der Klasse B, die von mehreren Instanzen von B stammt. Wie unten B b = neu B() b.M() Ich sehe keinen Punkt, um B verfügbar zu machen. –

+0

Ein weiterer nicht offensichtlicher Fall, bei dem eine Klasse, die 'IDisposable 'implementiert, für die Lebensdauer der Anwendung gehalten werden sollte, und nicht innerhalb eines' using' verwendet wird, ist' HttpClient'. Weitere Informationen finden Sie [hier] (https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/). –

+0

@BradleyUffner das war das prominenteste Beispiel in meinem Kopf, das mich davon abhielt absolut zu sprechen. –

Verwandte Themen