OpenXML:使用Element.Val和Element {Val =“ Val”}的区别

时间:2018-08-07 20:44:31

标签: c# .net openxml openxml-sdk

基本上,这个

pRp.GetFirstChild<ParagraphStyleId>().Val = "Heading1";

还有这个

pRp.GetFirstChild<ParagraphStyleId>().Remove();
                    pRp.InsertAt(new ParagraphStyleId() { Val = "Heading1" }, 0);

给我不同的结果。后者工作正常。第一个没有。为什么?

我想做的就是将文档的第一段设置为Heading1样式,无论是否存在ParagraphStyleId或是否设置了另一种样式。

还有,还有更好的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

要了解完整的方案,您需要了解引用类型和值类型之间的区别。仅C#7.0和更高版本支持返回的引用类型:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/ref-returns

在第一种情况下:

pRp.GetFirstChild<ParagraphStyleId>()

函数GetFirstChild需要返回一个引用,以便修改val属性以更改pRp对象。请记住,默认行为会返回所需对象的浅表副本。因此,您所做的任何更改都将应用于副本,而不是父对象。

在第二种情况下:

pRp.GetFirstChild<ParagraphStyleId>().Remove();

此行直接在父对象上操作,因此可以删除该对象。

pRp.InsertAt(new ParagraphStyleId() { Val = "Heading1" }, 0);

最后在这里,您通过在父实例上添加新对象再次对其进行操作。

主要区别在于,第一种情况是对ParagraphStyleId对象的副本进行操作,第二种情况是直接对父实例pRp进行操作。