XElement.WriteTo(XmlWriter) 和 XElement.Save(XmlWriter) 有什么区别?

What's the difference between XElement.WriteTo(XmlWriter) and XElement.Save(XmlWriter)?

XElement.WriteTo(XmlWriter)XElement.Save(XmlWriter)有什么区别?或者它们是一样的?

https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xelement.save#System_Xml_Linq_XElement_Save_System_Xml_XmlWriter_

https://docs.microsoft.com/en-gb/dotnet/api/system.xml.linq.xelement.writeto#System_Xml_Linq_XElement_WriteTo_System_Xml_XmlWriter_

XElement.Save(XmlWriter) 将完整的 xml 文档写入目标 XmlWriter,包括开始和结束文档声明。
要写入 XElement 本身的内容,它会调用相同的 WriteTo 方法。

来自.NET reference source

public void Save(XmlWriter writer)
{
    if (writer == null)
    {
        throw new ArgumentNullException("writer");
    }
    writer.WriteStartDocument();
    WriteTo(writer);
    writer.WriteEndDocument();
}


XElement.WriteTo(XmlWriter) 只是将给定的 XElement 写入目标 XmlWriter.

来自.NET reference source:

public override void WriteTo(XmlWriter writer)
{
    if (writer == null)
    {
        throw new ArgumentNullException("writer");
    }
    new ElementWriter(writer).WriteElement(this);
}

这允许 XElement 包含在已经包含任何其他 xml 节点的 XmlWriter 中,例如。自定义根 xml 元素,如下所示。
也可以对同一个 XmlWriter.

进行多次 XElement.WriteTo 调用
XElement xml = XElement.Parse("<foo>bar</foo>");

StringBuilder builder = new StringBuilder();    
using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();
    writer.WriteStartElement("root");

    xml.WriteTo(writer);

    writer.WriteEndElement();
    writer.WriteEndDocument();
}

Console.WriteLine(builder.ToString());

以上结果:

<?xml version="1.0" encoding="utf-16"?>
<root>
   <foo>bar</foo>
</root>