2016-04-21 5 views
0

Stellen Sie sich vor, ist es ein Problem, wenn ich Methode (IDisposable ist implementiert), wo mein privates Feld ist ein MemoryStream es im Konstruktor initialisiert wird.Den gleichen MemoryStream reinitialisieren, nachdem die Position dieses Streams auf 0 gesetzt wurde

Wird mein IDisposable alle Ressourcen bereinigen?

einmal privat deklarieren es und initialisieren es einmal im Konstruktor:

private myMemoryStream; 

MyConstructor(){ 
_myMemoryStream= new MemoryStream(); 
} 

es so in jeder Methode Reuse:

_myMemoryStream.Position=0; 
_myMemoryStream = ...; //new stream 

Abgleich (IDisposable in meiner Klasse implementiert):

public void Dispose() 
    { 
     if (_myMemoryStream != null) 
     { 
      _myMemoryStream.Close(/*todo: true oder false*/); 
      _myMemoryStream.Dispose(); 
     } 
    } 

Mit dieser Klasse in verschiedenen Kontexten werde ich eine using setzen um es herum.

Aktualisiert meine Frage (basierend auf @Oscar Vicente Perez Vorschläge), jetzt würde ich es so verwenden?!

+0

aktualisiert meine Frage – kkkk00999

+0

Wenn Ihre Wiederverwendung ist wie: \t '_myMemoryStream.Position = 0; \t _myMemoryStream = ...; // new stream' und '// new stream' ist' _myMemoryStream = new MemoryStream(); ' Sie behalten das gleiche Problem, das ich antworte. Wenn Sie eine bessere Antwort benötigen, geben Sie Ihren gesamten Code ein. –

Antwort

3

Feld! = Objekt

Feld == Referenz

Ein Feld sagt nur , wo ein Objekt gespeichert ist, nicht speichern Sie das Objekt selbst. Aber Sie ändern nur, wo die Bezugspunkte, die erste MemoryStream vergessen. Auf diese Weise verlassen Sie die Bereinigung von MemoryStream an die , und Sie können einige Leistungsprobleme bekommen.

Die schnellste Lösung ist Schließen Sie den aktuellen MemoryStream, bevor Sie den Verweis auf null setzen. Auch, wenn Sie gerade nach einer Schreib zu Beginn des Stroms gehen wollen, um es zu lesen, können Sie stream.Position = 0

Verwenden Sie keine Klasse-Feld verwenden, um temporäre Variablen zu enthalten, die verschiedene Objekte in jeder Methode verweist.

Statt:

private Stream field; 

public void Method1() 
{ 
    field = new Stream(); 
    ... 
} 

public void Method2() 
{ 
    field = new Stream(); 
    ... 
} 

Mit diesem Ansatz:

public void Method1() 
{ 
    using(Stream field = new Stream()) 
    {  
     ... 
    } 
} 

public void Method2() 
{ 
    using(Stream field = new Stream()) 
    {  
     ... 
    } 
} 
+0

Ok, aber ich möchte den 'MemoryStream' über die gesamte Klasse verwenden und wenn die Klasse verwendet wird (implementiert' IDisposable') werde ich ein 'using' drumherum legen, daran dachte ich .... – kkkk00999

+0

Wenn Sie immer dasselbe lesen/schreiben, sollten Sie Position = 0 verwenden. Wenn Sie verschiedene Dinge in differensts-Methoden lesen, empfehle ich Ihnen, ein lokales Methodenfeld anstelle eines Klassenfeldes in einer Using-Anweisung zu verwenden. –

+0

I aktualisierte Antwort –

0

Sie sollten explizit davon Close()/entsorgen, wenn Sie damit fertig sind und es dann zu null gesetzt, wenn Sie wirklich möchte. Das erneute Initialisieren desselben Felds/dieser Variablen verursacht kein Problem.

Dies wirft die Frage auf, warum Sie Ihr Feld auf diese Weise "wiederverwenden"? Wenn Sie nicht die gleiche Instanz Ihrer MemoryStream über Ihre Klasse benötigen, ist es wahrscheinlich ein wenig lesbarer, eine neue Variable zu deklarieren und zu verwenden, wenn Sie es benötigen, und Close(), wenn sie nicht mehr benötigt wird.

+0

Ok, aber wenn ich 'stream.Position = 0 'benutze, wird es mir gut gehen, denselben' MemoryStream' wiederzuverwenden? – kkkk00999

+0

Ich benutze das gleiche private Feld über die gleiche Klasse, weil ich temporary Feld haben wollte, die die Arbeit tun wird, wollte ich einen Platz, eine Art Arbeiter haben. – kkkk00999

+0

Wir brauchen mehr Code @ kkkk00999, um Ihnen eine gute Antwort zu geben –

Verwandte Themen