据我所知,这两个工具都用于代码生成。使用t4生成的库可以在任何地方使用,类型提供者只能与F#一起使用,那么有什么意义呢?
答案 0 :(得分:6)
T4严格来说是代码生成,而F#同时支持代码生成。和erased types,后者是F#类型提供者独有的功能。
此外,T4在我的经历中非常笨重。在过去一年左右的时间里,我在C#项目中使用了很多它们,虽然非常有用,但我遇到的源控制和构建集成存在许多问题。老实说,我对F#类型提供商没有多少经验,但从我看到的情况来看,它甚至比T4更清晰。场景(特别是关于构建集成)。
答案 1 :(得分:5)
正如@pad所说, 可以从C#中使用F#Type提供程序(取决于您实现类型提供程序的方式)。
IMO,类型提供商相对于T4的主要好处是它们作为.NET程序集分发,这使得从多个项目中使用它们变得更容易/更简单。 AFAIK,T4要求您将宏文件复制(或以其他方式包含)到您想要使用它们的每个项目中。(自从我使用T4以来已经过了几年,所以它可能会发生变化。)
总的来说,我认为类型提供商和T4之间的功能有很大的重叠;是的,如果您愿意,可以使用T4复制大部分类型提供程序功能。然而,你所做的函数编程越多,你就会越了解模块化 - 以恰当的数量 - 使函数式语言比它们的命令式函数更具生产力;出于同样的原因,构建类型提供程序的方式以及它们与F#编译器集成的方式使得它们比T4宏更好地使用在实践中。
答案 2 :(得分:3)
我对TypeProviders的经验非常有限,但我已经广泛使用了T4 4年
从我从TypeProviders那里读到的这些是我坚持使用T4的理由:
T4中的代码共享是使用<#@ include#>完成的。这个概念适用于T4。
对我而言,T4的优点在于简单的概念,与Visual Studio的完美集成以及多功能性(因为它可以生成任何类型的文本)。
在我使用System.Linq.Expression,System.Reflection.Emit,C ++部分模板技巧,C ++预处理器高阶宏和68000的自生成汇编代码进行MetaProgramming之前。所有这些技巧在编写时都很酷但是对于维护者来说并不酷。它们也很难调试并生成错误的错误消息。
对我而言TypeProviders似乎更难维护,代码更难调试,但是我对TypeProviders的了解很少来自于阅读一些博客。
当然,我的拙见。