Внутренняя реализация LINQ to XML X-DOM - PullRequest
0 голосов
/ 25 марта 2011

Как внутренне реализовано LINQ to XML X-DOM из пространства имен System.Xml.Linq? (XNode, XElement и т. Д.)

Использует ли он стандартный высокопроизводительный односторонний XmlReader / XmlWriter из других пространств имен XML или что-то еще?

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

1 Ответ

2 голосов
/ 28 марта 2011

Использование Reflector (или, если оно больше не бесплатно, ILSpy :);нет, я не сотрудник - просто тайно распространяю слово!) все каналы загрузки / сохранения отображаются на XmlReader и XmlWriter.Например - реализация XElement Load(Stream, LoadOptions) делает это:

public static XElement Load(Stream stream, LoadOptions options)
{
  XmlReaderSettings xmlReaderSettings = XNode.GetXmlReaderSettings(options);
  using (XmlReader reader = XmlReader.Create(stream, xmlReaderSettings))
  {
    return Load(reader, options);
  }
}

И это аналогичная история для всех других статических методов - включая Parse.

Но тогда есть XStreamingElementконструктор - однако я не могу найти его реального использования вне самого класса XElement.Похоже, это может быть оптимизированный тип для загрузки, который пока еще не используется.

Точно так же методы Save и WriteTo в конечном итоге используют экземпляр XmlWriter - например:

public void Save(string fileName, SaveOptions options)
{
  XmlWriterSettings xmlWriterSettings = XNode.GetXmlWriterSettings(options);
  using (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings))
  {
    this.Save(writer);
  }
}

Так что, по крайней мере, с точки зрения производительности они начали с правильных типов:)

...