Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我从XDocument创建了一个元素列表,那么是否在内存中创建了元素列表的新副本?_C#_Xml_Linq_Memory Management_Linq To Xml - Fatal编程技术网

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);