基本上,这个
pRp.GetFirstChild<ParagraphStyleId>().Val = "Heading1";
而这个
pRp.GetFirstChild<ParagraphStyleId>().Remove();
pRp.InsertAt(new ParagraphStyleId() { Val = "Heading1" }, 0);
给了我不同的结果。后者按预期工作。第一个没有。为什么?
我正在尝试做的是将文档的第一段设置为Heading1样式,无论是否存在ParagraphStyleId,或者是否设置了其他样式。
另外,有没有更好的方法可以做到这一点?
谢谢!
若要了解完整方案,需要了解引用类型和值类型之间的差异。只有 C# 7.0 及更高版本支持返回 ref 类型:https://learn.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(上进行操作。