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

OpenXML: Difference of using Element.Val and Element{ Val = "Val" }

基本上,这个

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

还有这个

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

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

我想做的是将文档的第一段设置为 Heading1 样式,无论 ParagraphStyleId 是否存在,或者是否已设置其他样式。

此外,有更好的方法吗?

谢谢!

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

第一种情况:

pRp.GetFirstChild<ParagraphStyleId>()

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

第二种情况:

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

这一行直接对父对象进行操作,这就是为什么能够移除对象的原因。

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

最后在这里,您通过向父实例中附加一个新对象再次对父实例进行操作。

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