2016-08-25 12 views
1

Фрагмент кода выглядит следующим образомНесколько блоков использования, этот код безопасен?

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()); 
     } 
    } 

Насколько я знаю, если класс содержит поле, которое IDisposable Затем он должен осуществить сам IDisposable и заботиться о распоряжении принадлежащего объекта, так и с этими предположениями, после удаления streamWriter также будет удален gZipOutputStream и memoryStream. Но нам по-прежнему не нужно выделять memoryStream для вызова метода toArray() на нем.
Итак, вопрос в том, вызывает ли метод ToArray() метод memoryStream в конце безопасного?

+2

Есть ли причина, по которой вам нужно позвонить в конце? Я бы назвал это сразу после streamWriter.Write. – Kevin

+3

@Kevin 'GZipStream', возможно, не обработал все данные после вызова' StreamWriter.Write'. – Dirk

ответ

6

Если я правильно понял ваш вопрос, вы спрашиваете, можно ли позвонить по телефону ToArray() по телефону MemoryStream после его размещения.

Если да, то да, это безопасно. В documentation указывается:

Этот метод работает, когда MemoryStream закрыт.

EDIT: И в случае, если это не ясно closed также означает ли disposed, вы также можете посмотреть на source code для Dispose метода (Примечание: ссылка на Stream.Dispose() поскольку MemoryStream не переопределить метод Dispose):

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(); 
} 

Как вы можете видеть, вызывая Dispose() ничего не делает больше, чем вызов Close().

+3

Закрыто или расположено? – Mathieu

 Смежные вопросы

  • Нет связанных вопросов^_^