Zacząłem używać klas implementujących IDisposable do pisania bloków w strumieniach, za pomocą instrukcji using. Jest to pomocne w utrzymywaniu prawidłowego zagnieżdżania i unikaniu brakujących lub nieprawidłowo umieszczonych części początkowych/końcowych.using (IDisposable obj = new ...) w C# do pisania bloków kodu w strumieniu (np. XML)
Zasadniczo konstruktor zapisuje początek bloku (np. Otwierając znacznik XML), Usuwa() koniec (np. Zamykający znacznik XML). Przykładem jest plik UsableXmlElement poniżej (dotyczy to dużych plików XML, więc LINQ do XML lub XmlDocument w pamięci nie są opcjami).
Jednak te IDisposable nie implementują wyrafinowanego wzorca zalecanego przez Microsoft, z Destructor/Finalizer, oddzielną metodą Dispose (bool) i GC.SuppressFinalize(). Dispose po prostu pisze element końcowy i to wszystko.
Czy jest jakiś problem z tym związany, czy jest to dobry sposób na utrzymanie prawidłowego zagnieżdżenia elementów?
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();
}
}
Wykorzystanie jest tak:
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
}
}
Wynikające w:
<RootElement DocVersion="123">
<InnerElement>
<!-- anything -->
</InnerElement>
</RootElement>
Dlaczego powinien to być problem? Nie zdobędziesz żadnych niezarządzanych zasobów w pliku UsableXmlElement, więc nie potrzebujesz żadnych finalizatorów, myślę, że ... – user1096188
Aha, i nie potrzebujesz parametrów WriteValue i WriteAttribute, aby były ogólne. Nic nie robi, ponieważ parametr _xwriter.WriteValue zawsze będzie wywoływany z parametrem obiektu. – user1096188
Hummmmmm ........ – code4life