Я начал использовать классы, реализующие IDisposable, для записи блоков в потоках с помощью оператора using.Это полезно, чтобы сохранить правильное вложение и избежать отсутствующих или неправильно размещенных начальных / конечных частей.
По сути, конструктор записывает начало блока (например, открывающий тег XML), Dispose () - конец (например, закрытие).Тег XML).Примером является приведенный ниже UsableXmlElement (он предназначен для больших XML, поэтому в LINQ to XML или XmlDocument в памяти нет параметров).
Однако эти IDisposable не реализуют изощренный шаблон, рекомендованный Microsoft, с разделителем-разрушителем / финализаторомУдалите (bool) метод и GC.SuppressFinalize ().Утилизация просто записывает конечный элемент, и все.
Есть ли какая-то обратная сторона этого или это хороший способ поддерживать правильное вложение элементов?
class UsableXmlElement : IDisposable
{
private XmlWriter _xwriter;
public UsableXmlElement(string name, XmlWriter xmlWriter)
{
_xwriter = xmlWriter;
_xwriter.WriteStartElement(name);
}
public void WriteAttribute<T>(string name, T value)
{
_xwriter.WriteStartAttribute(name);
_xwriter.WriteValue(value);
_xwriter.WriteEndAttribute();
}
public void WriteValue<T>(T value)
{
_xwriter.WriteValue(value);
}
public void Dispose()
{
_xwriter.WriteEndElement();
}
}
Использованиекак это:
var xWriter = new XmlWriter(...)
using(var rootElement = new UsableXmlElement("RootElement", xWriter)
{
rootElement.WriteAttribute("DocVersion", 123)
using(var innerElement = new UsableXmlElement("InnerElement", xwriter)
{
// write anything inside Inner element
}
}
В результате:
<RootElement DocVersion="123">
<InnerElement>
<!-- anything -->
</InnerElement>
</RootElement>