SyntaxGenerator 和 SyntaxFactory 有什么区别?

What's the difference between SyntaxGenerator and SyntaxFactory?

更具体地说:Microsoft.CodeAnalysis.Editing.SyntaxGeneratorMicrosoft.CodeAnalysis.CSharp.SyntaxFactory

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

2) 一个更好 and/or 比另一个更新吗?我只怀疑是因为我发现 this.

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

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

如果您通读 SyntaxGeneratorimplementations,您会发现他们在后台使用 SyntaxFactory

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

void Method()
{
}

语法工厂

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

语法生成器

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

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