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。
基本上,这个
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。