据我所知,这两种工具都用于代码生成。使用 t4 生成的库可以在任何地方使用,而类型提供程序只能用于 F#,那么有什么意义呢?
3 回答
T4 是严格的代码生成,而 F# 支持两种代码生成。和擦除类型,后者是 F# 类型提供程序独有的功能。
此外,根据我的经验,T4 相当笨重。在过去一年左右的时间里,我在 C# 项目中使用了其中的一些,虽然非常有用,但我遇到了很多关于源代码控制和构建集成的问题。老实说,我对 F# 类型提供程序的经验并不多,但据我所见,即使对于代码生成,它也比 T4 更干净。场景(特别是关于构建集成)。
正如@pad 所说,可以从 C# 使用 F# 类型提供程序(取决于您如何实现类型提供程序)。
IMO,类型提供程序相对于 T4 的主要好处是它们作为 .NET 程序集分发,这使得在多个项目中使用它们变得更加容易/简单。AFAIK,T4 要求您将宏文件复制(或以其他方式包含)到您想要使用它们的每个项目中。(虽然我使用 T4 已经有几年了,所以这可能已经改变了。)
总的来说,我认为 Type Providers 和 T4 之间的功能有很大的重叠;所以是的,如果您愿意,您可以使用 T4 复制大部分类型提供程序功能。然而,你做的函数式编程越多,你就会越多地了解模块化——恰到好处——是使函数式语言比它们的命令式兄弟更有生产力的原因;出于同样的原因,类型提供程序的构造方式以及它们与 F# 编译器的集成方式使它们在实践中比 T4 宏更好用。
我在 TypeProviders 方面的经验非常有限,但我已经广泛使用 T4 4 年了
根据我从 TypeProviders 读到的内容,这些是我坚持使用 T4 的原因:
- T4在概念上很简单,即生成代码的PHP/ASP
- T4 生成可读代码,这些代码像普通源代码一样编译和调试
- 如果未来的维护者愿意,他们可以停止使用 T4 并手动维护生成的工件(我当然不建议这样做,但这是可能的)
- T4可以生成C#、VB、F#、C++、C、T-SQL、XML等。我主要将它用于 C#,但事实证明生成 C++ 和 T-SQL 可以节省大量时间。
- T4 和 partial 配合得很好
T4 中的代码共享是使用 <#@include#> 完成的,该概念适用于 T4。
对我来说,让 T4 伟大的是简单的概念、与 Visual Studio 的出色集成和多功能性(因为它可以生成任何类型的文本)。
在我使用 System.Linq.Expression、System.Reflection.Emit、C++ 部分模板技巧、C++ 预处理器高阶宏和自生成汇编代码为 68000 进行元编程之前。所有这些技术在编写时都很酷,但对于维护者。它们也很难调试并产生糟糕的错误消息。
对我来说,TypeProviders 似乎更难维护,代码也更难调试,但我对 TypeProviders 的了解很少来自阅读一些博客。
当然,这都是我的拙见。