Я могу “встроить” переменную, если это - IDisposible?

Я должен сделать это, чтобы гарантировать, что от 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);
  }
11
задан Colin 11 February 2010 в 15:22
поделиться

6 ответов

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

10
ответ дан 3 December 2019 в 03:04
поделиться

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

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

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

Поэтому, как правило, выбирайте первый синтаксис.

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

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

11
ответ дан 3 December 2019 в 03:04
поделиться

There is an option to use XmlReaderSettings and set CloseInput to true like this

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

Here: XmlReaderSettings.CloseInput Property

4
ответ дан 3 December 2019 в 03:04
поделиться

This really depends on the Dispose() of XmlReader. It would take some work to figure out exactly what it does. I personally write code like the first sample. If you new something, then it is your responsibility to dispose it. You shouldn't expect others to take care of it for you (although they may).

3
ответ дан 3 December 2019 в 03:04
поделиться

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

-1
ответ дан 3 December 2019 в 03:04
поделиться

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

  1. С точки зрения дизайна с точки зрения лучших практик, следует ли всегда размещать объект, для которого вы ответственный? Да
  2. Вы столкнетесь с утечкой памяти по схеме, показанной во втором примере? Нет , хотя бы по той причине, что MemoryStream.Dispose на самом деле ничего не делает .
2
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: