基本上,这个
pRp.GetFirstChild<ParagraphStyleId>().Val = "Heading1";
还有这个
pRp.GetFirstChild<ParagraphStyleId>().Remove();
pRp.InsertAt(new ParagraphStyleId() { Val = "Heading1" }, 0);
给我不同的结果。后者工作正常。第一个没有。为什么?
我想做的就是将文档的第一段设置为Heading1样式,无论是否存在ParagraphStyleId或是否设置了另一种样式。
还有,还有更好的方法吗?
谢谢!
答案 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进行操作。