Я должен сделать это, чтобы гарантировать, что от 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);
}
XmlReader по умолчанию (но см. предложение Колина и dh) не предполагает, что только он использует поток, поэтому первый вариант - единственный безопасный вариант Dispose.
Как правило, да, вы должны написать код, как в первом примере.
Есть некоторые классы, которые принимают право собственности на переданный им объект, так что когда вы избавляетесь от внешнего объекта, он автоматически избавляется от внутреннего объекта за вас, но это исключение из правил.
В любом случае, вызов Dispose
более одного раза должен быть безопасным. То есть, объекты должны реализовать это так, чтобы это было безопасно, выполняя работу только в первый раз.
Поэтому, как правило, выбирайте первый синтаксис.
Теперь, для указанного примера, это не должно иметь значения, так как MemoryStream
на самом деле не хранит никаких ресурсов, которые должны быть утилизированы, но есть проблема и с этим ожиданием. Если вы знаете, что данная версия объекта не использует ресурс, поэтому можно игнорировать Dispose
, то если этот объект в будущем получит такой ресурс, вы внезапно получите утечку.
Если вы не видите какого-то отрицательного эффекта от данного кода, например, слишком больших накладных расходов, то я бы просто не беспокоился об этом.
There is an option to use XmlReaderSettings and set CloseInput to true like this
var reader = XmlReader.Create(new MemoryStream(), new XmlReaderSettings {CloseInput = true});
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).
Потоки памяти на самом деле не требуют вызова Dispose (). Однако в целом вопрос по-прежнему актуален, поскольку для других типов потоков требуется Dispose ().
Вы говорите о двух разных вещах:
MemoryStream.Dispose
на самом деле ничего не делает .