SyntaxGenerator 和 SyntaxFactory 有什么区别?
What's the difference between SyntaxGenerator and SyntaxFactory?
更具体地说:Microsoft.CodeAnalysis.Editing.SyntaxGenerator
和 Microsoft.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,
Project
或 Workspace
.
如果您通读 SyntaxGenerator
的 implementations,您会发现他们在后台使用 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");
生成器只是构建语法树的一种更简洁的方法。
更具体地说:Microsoft.CodeAnalysis.Editing.SyntaxGenerator
和 Microsoft.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,
Project
或 Workspace
.
如果您通读 SyntaxGenerator
的 implementations,您会发现他们在后台使用 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");
生成器只是构建语法树的一种更简洁的方法。