Подтвердить что ты не робот

Могу ли я "встроить" переменную, если она не подходит?

Нужно ли это делать, чтобы обеспечить правильную утилиту MemoryStream?

  using (MemoryStream stream = new MemoryStream(bytes))
  using (XmlReader reader = XmlReader.Create(stream))
  {
    return new XmlDocument().Load(reader);
  }

или нормально ли встроить MemoryStream, чтобы он просто вышел из области видимости? Как это?

  using (XmlReader reader = XmlReader.Create(new MemoryStream(bytes)))
  {
    return new XmlDocument().Load(reader);
  }
4b9b3361

Ответ 1

XmlReader не по умолчанию (но см. предложение Colin и dh) предполагает, что он единственный, использующий поток, поэтому первый вариант является единственным безопасным для Dispose.

Ответ 2

Как правило, да, вы должны написать код, как в первом примере.

Есть несколько классов, которые берут на себя ответственность за переданный ему объект, поэтому, когда вы удаляете внешний объект, он автоматически предоставляет вам внутренний объект, но это исключение из правила.

В любом случае вызов Dispose более одного раза должен быть безопасным. То есть объекты должны реализовывать это так, чтобы это было безопасно, только выполняли работу в первый раз.

Итак, как правило, переходите к первому синтаксису.

Теперь, для указанного примера, это не имеет большого значения, поскольку MemoryStream на самом деле не держится за любые ресурсы, которые нужно утилизировать, но также есть проблема с этим ожиданием. Если вы знаете, что данная версия объекта не использует ресурс, поэтому безопасно игнорировать Dispose, то если этот объект в будущем получит такой ресурс, вы вдруг получите утечку.

Если вы не видите какого-либо негативного эффекта с данным кодом, например, добавляете слишком много накладных расходов, тогда я просто не буду беспокоиться об этом.

Ответ 3

Существует возможность использовать XmlReaderSettings и установить CloseInput как true

var reader = XmlReader.Create(new MemoryStream(), new XmlReaderSettings {CloseInput = true});

Здесь: Свойство XmlReaderSettings.CloseInput

Ответ 4

Это действительно зависит от Dispose() XmlReader. Требуется некоторая работа, чтобы точно определить, что она делает. Я лично пишу код, как первый образец. Если вы что-то новое, то это ваша ответственность - распоряжаться им. Вы не должны ожидать, что другие позаботятся об этом для вас (хотя они могут).

Ответ 5

Вы говорите о двух разных вещах:

  • С точки зрения передового опыта, если вы всегда располагаете объектом, за который вы несете ответственность? Да
  • Вы будете испытывать утечку памяти после шаблона, который вы видите во втором примере? Нет, если только по той причине, что MemoryStream.Dispose фактически ничего не делает.

Ответ 6

Потокам памяти на самом деле не требуется вызывать Dispose(). Однако вопрос остается в силе в целом, поскольку для других видов потоков требуется Dispose().