SyntaxGenerator和SyntaxFactory之间的区别是什么?

时间:2016-11-21 06:18:40

标签: roslyn

更具体一点:Microsoft.CodeAnalysis.Editing.SyntaxGeneratorMicrosoft.CodeAnalysis.CSharp.SyntaxFactory

1)我的理解是它们都是Roslyn的一部分,并且都用于生成代码,这是正确的吗?如果是,该类别中还有其他人吗?

2)一个比另一个更好和/或更新吗?我只怀疑这是因为我找到了this

1 个答案:

答案 0 :(得分:8)

每个SyntaxFactory(其中一个用于VB,一个用于C#)与其语言紧密耦合。从某种意义上说,SyntaxFactory是一个较低级别的"可用于创建语法树的API。使用SyntaxFactory时,您可以控制树中的每个语法节点,标记和琐事。这是有代价的:阅读和理解使用SyntaxFactory的源代码更难,因为它非常详细。

SyntaxGenerator提供了与语言无关的API,可用于创建C#或VB .NET语法的片段。它提供的API比SyntaxFactory更易于使用且更简洁。请注意,要创建SyntaxGenerator,我们需要Document, ProjectWorkspace

如果您通读了SyntaxGenerator的{​​{3}},那么您会发现他们正在使用SyntaxFactory

我们可以在生成以下代码时比较两个API:

void Method()
{
}

SyntaxFactory

var method = SyntaxFactory.MethodDeclaration(
                    SyntaxFactory.PredefinedType(
                        SyntaxFactory.Token(SyntaxKind.VoidKeyword)),
                    SyntaxFactory.Identifier("Method"))
                .WithBody(
                    SyntaxFactory.Block()))))

SyntaxGenerator

SyntaxGenerator generator = SyntaxGenerator.GetGenerator(...); //We need a Document, Project or Workspace
var method = generator.MethodDeclaration("Method");

生成器只是构建语法树的一种更简洁的方法。