我一直在了解 Roslyn CTP,虽然它解决了与表达式树API类似的问题,但两者都是不可变的,但Roslyn通过一种完全不同的方式实现:
Expression
节点没有对父节点的引用,使用ExpressionVisitor
进行修改,因此可以重复使用大部分内容。另一方面,Roslyn的
SyntaxNode
有一个对其父节点的引用,因此所有节点实际上成为一个不可能被重复使用的块。提供了诸如Update
、ReplaceNode
等方法来进行修改。
这会到哪里?Document
?Project
?ISolution
?该API鼓励逐步更改树(而不是向上按钮),但每个步骤是否都会进行完整的复制?
他们为什么要做出这样的选择?我是否错过了一些有趣的技巧?