我看到越来越多的开源库使用.NET 5的源代码生成器,这提高了它们的性能。
就我所能理解的docs而言,它们是要取代System.Reflection
,因为它是以牺牲性能为代价的。是这样吗?我个人对源代码生成器的了解是,当它们在.NET 5中引入时,它们是要基于.proto数据契约文件生成C#代码的。
MediatR有一个克隆库,它使用源代码生成器而不是System.Reflection
。
您能否简化源代码生成器在该MediatR library和整体中的优势和用法?
我看到越来越多的开源库使用.NET 5的源代码生成器,这提高了它们的性能。
就我所能理解的docs而言,它们是要取代System.Reflection
,因为它是以牺牲性能为代价的。是这样吗?我个人对源代码生成器的了解是,当它们在.NET 5中引入时,它们是要基于.proto数据契约文件生成C#代码的。
MediatR有一个克隆库,它使用源代码生成器而不是System.Reflection
。
您能否简化源代码生成器在该MediatR library和整体中的优势和用法?
1条答案
按热度按时间ubby3x7f1#
源代码生成器其实并不神奇--它只是一些自定义的代码片段,将文本生成到文件中,然后插入到编译过程中,并成为二进制输出的一部分(例如DLL或EXE),就好像它是在编译之前手动输入到某个源文件中的一样。
这里唯一的“魔力”是分析器即生成器的形式化概念,它使Visual Studio能够自动将原始源代码传递到自定义生成器例程中,并在生成项目时包含输出。
源代码生成器的一个应用是为某些操作创建专门的、类型特定的代码,否则这些操作将需要运行时反射。运行时反射通常相当慢并且占用大量CPU资源,但通常需要运行时反射来集中对未知对象的常见操作的逻辑。一个常见的示例是对象的序列化和反序列化。这可以通过反射来完成(在运行时查找属性、调用getter和setter等)或通过更快的、直接引用属性并从数据流读取/写入数据流的类型特定的代码。然而,为每种类型创建这样的专用代码是非常枯燥的,重复的工作和因此进入源代码生成器。他们可以在构建时做“反射”,并输出苗条,快速的代码到临时的。cs文件,这些文件与产品一起编译。