C# 如果我从XDocument创建了一个元素列表,那么是否在内存中创建了元素列表的新副本?
如果从C# 如果我从XDocument创建了一个元素列表,那么是否在内存中创建了元素列表的新副本?,c#,xml,linq,memory-management,linq-to-xml,C#,Xml,Linq,Memory Management,Linq To Xml,如果从XDocument.Load将XDocument加载到内存中,然后对其执行LINQ-XML查询,例如: XDocument doc = XDocument.Load(@"C:/doc.xml"); var orders = doc.Root.Element("Envelope").Elements("Order"); 是否有第二行返回的IEnumerable的内存副本?或者它只是原始XDocument 如果我通过调用.ToList()?仅仅是一个引用来枚举它呢 您必须使用new操作符将内
XDocument.Load
将XDocument
加载到内存中,然后对其执行LINQ-XML查询,例如:
XDocument doc = XDocument.Load(@"C:/doc.xml");
var orders = doc.Root.Element("Envelope").Elements("Order");
是否有第二行返回的IEnumerable
的内存副本?或者它只是原始XDocument
如果我通过调用.ToList()
?仅仅是一个引用来枚举它呢
您必须使用
new
操作符将内存分配给堆上的新列表 XDocument.Load
会将整个数据集读取到内存中
对数据的查询将返回对现有元素的引用。例如,检查的引用源,将现有节点直接(通过引用)提供给调用者
查询文档时生成的主要额外内存将是实现迭代器本身所需的内存,这与文档大小相比应该非常小
是否有第二行返回的IEnumerable的内存副本?或者它只是原始XDocument的参考副本
正如其他人指出的,是后者
如果确实需要元素的深度克隆,可以使用:
XElement
是一种引用类型。它将被分配到堆上。
var ordersCopy = doc.Root.Element("Envelope").Elements("Order").Select(element => new XElement(element);