2016-08-25 2 views
1

-Code-Schnipsel ist alsMehrfach verwendbarer Block, ist dieser Code sicher?

public static string ToCompressedBase64(this string text) 
    { 
     using (var memoryStream = new MemoryStream()) 
     { 
      using (var gZipOutputStream = new GZipStream(memoryStream, CompressionMode.Compress)) 
      { 
       using (var streamWriter = new StreamWriter(gZipOutputStream)) 
       { 
        streamWriter.Write(text); 
       } 
      } 
      return Convert.ToBase64String(memoryStream.ToArray()); 
     } 
    } 

folgt Soweit ich weiß, wenn Klassenfeld enthält, die IDisposable ist, dann sollte es IDisposable selbst und kümmern sich um die Entsorgung des eigene Objekts, so mit diesen Annahmen implementieren, nach der Entsorgung von streamWriter werden auch der gZipOutputStream und memoryStream entsorgt. Aber wir müssen noch nicht memoryStream entsorgt haben, um toArray() -Methode auf It aufzurufen.
Die Frage ist also, ruft ToArray() Methode auf MemoryStream am Ende sicher?

+2

Gibt es einen Grund, warum Sie es am Ende anrufen müssen? Ich würde es sofort nach dem streamWriter.Write aufrufen. – Kevin

+3

@Kevin Der 'GZipStream' hat möglicherweise nicht alle Daten nach dem Aufruf von' StreamWriter.Write' verarbeitet. – Dirk

Antwort

6

Wenn ich Ihre Frage richtig verstehe, fragen Sie, ob es sicher ist, ToArray() auf einem MemoryStream zu nennen, nachdem es entsorgt wurde.

Wenn ja, dann ist es sicher. Die documentation spezifiziert:

Diese Methode funktioniert, wenn die MemoryStream geschlossen ist.

EDIT: Und für den Fall, es ist nicht klar, ob closed bedeutet auch disposed, können Sie an den source code für den Dispose Methode (Hinweis siehe auch: Der Link seit MemoryStream-Stream.Dispose() ist die Dispose Methode nicht außer Kraft setzen):

public void Dispose() 
{ 
    /* These are correct, but we'd have to fix PipeStream & NetworkStream very carefully. 
    Contract.Ensures(CanRead == false); 
    Contract.Ensures(CanWrite == false); 
    Contract.Ensures(CanSeek == false); 
    */ 

    Close(); 
} 

Wie man sehen kann, tut Dispose() ruft nichts anderes als Close() aufrufen.

+3

Geschlossen oder entsorgt? – Mathieu