SyntaxGenerator和SyntaxFactory有什么区别?

use*_*441 2 roslyn

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

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

2)一个比另一个更好和/或更新吗?我只怀疑因为我发现了这个.

Jos*_*rty 9

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

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

如果你仔细阅读了它们的实现,SyntaxGenerator你会发现它们正在使用SyntaxFactory引擎盖.

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

void Method()
{
}
Run Code Online (Sandbox Code Playgroud)

SyntaxFactory

var method = SyntaxFactory.MethodDeclaration(
                    SyntaxFactory.PredefinedType(
                        SyntaxFactory.Token(SyntaxKind.VoidKeyword)),
                    SyntaxFactory.Identifier("Method"))
                .WithBody(
                    SyntaxFactory.Block()))))
Run Code Online (Sandbox Code Playgroud)

SyntaxGenerator

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

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

  • 我对吗,````SyntaxGenerator```` 不允许处理琐事?例如,我找不到创建注释或预处理器指令的方法。 (2认同)
  • 据我所知,您必须使用 `SyntaxFactory` 来创建注释/预处理器指令。您可以使用 https://roslynquoter.azurewebsites.net 来确定要使用的内容。 (2认同)