XStreamingElement 从名字上面,已经能看出它是使用流的模式来创建Element
看到它的MSDN在线文档(http://msdn.microsoft.com/zh-cn/library/system.xml.linq.xstreamingelement(v=vs.95).aspx#Y200)
是这么解释的
XElement 在操作结点时,是把变量加到结点上,而XStreamingElement则是把变量内存地址加到结点上
变量自身的内存占用和变量地址的内存占用显然有比较大的差距,而这也直接影响着性能,这些步骤在循环中发生,结点的个数也
直接拉开内存占用大小的距离。所以XStreamingElement比较适合创建比较大的XML文件
另一个特征就是XStreaming的延迟查询能力,序列化发生的次数只有一次,也就是最后循环执行完毕以后才发生!
下面以一个例子来说明他们之间的区别
以下例子来自英文版电子书
Pro LINQ: Language Integrated Query in C# 2010
第246页
XElement
string[] names = { "John", "Paul", "George", "Pete" }; XElement xNames = new XElement("Beatles", from n in names select new XElement("Name", n)); names[3] = "Ringo"; Console.WriteLine(xNames);
输出
<Beatles> <Name>John</Name> <Name>Paul</Name> <Name>George</Name> <Name>Pete</Name> </Beatles>
结果看到,第三个元素并没有变成"Ringo",因为它在循环时就在创建XML树了,故之后无论怎么修改那个数组
都跟该XML树无关
XStreamingElement
string[] names = { "John", "Paul", "George", "Pete" }; XStreamingElement xNames = new XStreamingElement("Beatles", from n in names select new XStreamingElement("Name", n)); names[3] = "Ringo"; Console.WriteLine(xNames);
输出
<Beatles> <Name>John</Name> <Name>Paul</Name> <Name>George</Name> <Name>Ringo</Name> </Beatles>
从结果已经可以看出XStreamingElement是怎么工作的了,在Console.WriteLine(xNames);这一行
XML树才真正被创建,故在这一行代码执行之前,对数组的任何改变都是有效的