私の知る限り、両方のツールがコード生成に使用されています。t4 で生成されたライブラリはどこでも使用でき、型プロバイダーは F# でのみ使用できます。
3 に答える
@pad が言ったように、C# から F# 型プロバイダーを使用することが可能です (型プロバイダーの実装方法によって異なります)。
IMO、T4 に対する型プロバイダーの主な利点は、それらが .NET アセンブリとして配布されることです。これにより、複数のプロジェクトからそれらを使用することがはるかに簡単になります。私の知る限り、T4 では、マクロ ファイルを使用する各プロジェクトにコピー (または別の方法で含める) 必要があります。
一般に、タイプ プロバイダーと T4 の機能には大きな重複があると思います。そのため、必要に応じて、タイプ プロバイダーの機能の多くを T4 で複製することができます。ただし、関数型プログラミングを行えば行うほど、適切な量のモジュール性が、関数型言語を命令型言語よりもはるかに生産的にするものであることを学ぶことができます。これと同じ理由で、タイプ プロバイダーの構築方法と F# コンパイラとの統合方法により、実際には T4 マクロよりも使いやすくなっています。
TypeProvider の経験は非常に限られていますが、T4 を 4 年間幅広く使用してきました
TypeProviders から読んだ内容から、T4 に固執する理由は次のとおりです。
- T4 は概念的に単純です。つまり、コードを生成する PHP/ASP です。
- T4 は、通常のソース コードのようにコンパイルおよびデバッグされる可読コードを生成します。
- 将来のメンテナーが希望する場合は、T4 の使用を停止し、生成されたアーティファクトを手動で維持できます (もちろんお勧めしませんが、可能です)。
- T4 は、C#、VB、F#、C++、C、T-SQL、XML などを生成できます。私は主に C# に使用しましたが、C++ と T-SQL を生成すると、大幅な時間の節約になることが証明されています。
- T4 とパーシャルは非常にうまく連携します
T4 でのコード共有は <#@include#> を使用して行われ、その概念は T4 でうまく機能します。
私にとって T4 の優れた点は、シンプルなコンセプト、Visual Studio との優れた統合、および多用途性 (あらゆる種類のテキストを生成できること) です。
System.Linq.Expression、System.Reflection.Emit、C++ 部分テンプレート トリック、C++ プリプロセッサの高次マクロ、および 68000 の自己生成アセンブリ コードを使用して MetaProgramming を行う前に、これらの手法はすべて、作成時にはクールですが、作成時にはクールではありません。メンテナー。また、デバッグが難しく、質の悪いエラー メッセージを生成していました。
TypeProviders は保守が難しく、コードのデバッグも難しいように思えますが、TypeProviders について少し知っていることは、いくつかのブログを読むことから得られます。
もちろん、すべて私の謙虚な意見です。