私は最近 F# に注目しており、すぐに垣根を越えることはありそうにありませんが、C# (またはライブラリのサポート) が生活を楽にするいくつかの分野を明確に示しています。
特に、F# のパターン マッチング機能について考えています。これにより、非常に豊富な構文が可能になり、現在のスイッチ/条件付き C# の等価物よりもはるかに表現力豊かになります。直接的な例を挙げようとはしませんが (私の F# はそれに対応していません)、要するに次のことが可能です。
- 型による照合 (判別共用体のフル カバレッジ チェックを使用) [これは、バインドされた変数の型も推測し、メンバー アクセスなどを与えることに注意してください]
- 述語による一致
- 上記の組み合わせ (および、おそらく私が認識していない他のシナリオ)
最終的に C# がこの豊富な機能の一部を借用できれば素晴らしいと思いますが、その間、私は実行時に何ができるかを調べてきました。
var getRentPrice = new Switch<Vehicle, int>()
.Case<Motorcycle>(bike => 100 + bike.Cylinders * 10) // "bike" here is typed as Motorcycle
.Case<Bicycle>(30) // returns a constant
.Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
.Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
.ElseThrow(); // or could use a Default(...) terminator
getRentPrice は Func<Vehicle,int> です。
[注 - おそらく、ここでのスイッチ/ケースは間違った用語です...しかし、それはアイデアを示しています]
私にとって、これは、if/else を繰り返し使用する同等の方法や、複合三項条件 (自明ではない式では非常に面倒です - 括弧がたくさんあります) よりもはるかに明確です。また、多くのキャストを回避し、VB の Select...Case "x To y " 利用方法。
上記のような構成要素に大きなメリットがあると人々が考えているかどうかを判断しようとしているだけです (言語サポートがない場合)。
さらに、上記の 3 つのバリエーションで遊んでいることに注意してください。
- 評価用の Func<TSource,TValue> バージョン - 複合三項条件文に相当
- Action<TSource> バージョン - if/else if/else if/else if/else と同等
- Expression<Func<TSource,TValue>> バージョン - 最初のバージョンですが、任意の LINQ プロバイダーで使用できます
さらに、式ベースのバージョンを使用すると、繰り返し呼び出しを使用するのではなく、本質的にすべてのブランチを単一の複合条件付き式にインライン化して、式ツリーの書き換えが可能になります。私は最近チェックしていませんが、初期の Entity Framework ビルドでは、InvocationExpression があまり好きではなかったため、これが必要だったことを思い出すようです。また、デリゲート呼び出しの繰り返しが回避されるため、LINQ-to-Objects をより効率的に使用できます。テストでは、同等の C# と比較して、同じ速度 [実際にはわずかに速い] で実行される (式フォームを使用した) 上記のような一致が示されます。複合条件ステートメント。完全を期すために、Func<...> ベースのバージョンは C# 条件ステートメントの 4 倍の時間がかかりましたが、それでも非常に高速であり、ほとんどのユース ケースで大きなボトルネックになる可能性は低いです。
上記について (または、より豊富な C# 言語サポートの可能性について... 期待しています ;-p) についての考え、意見、批評などを歓迎します。