我最近一直在关注F#,虽然我不太可能在短期内越过栅栏,但它肯定突出了C# (或库支持)可以让生活变得更容易的一些领域。
特别是,我正在考虑F#的模式匹配功能,它允许非常丰富的语法-比当前的switch/conditional 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。
注意--这里的Switch/Case可能是错误的术语...但它表明了这个想法
对我来说,这比使用重复的if/else或复合三元条件(对于非平凡的表达式会变得非常混乱-括号中有很多)的等价物要清楚得多。它还避免了大量的强制转换,并允许对更具体的匹配进行简单的扩展(直接或通过扩展方法),例如InRange(...)匹配相当于VB Select...Case "x to y“的用法。
我只是想知道人们是否认为像上面这样的构造(在缺乏语言支持的情况下)有很多好处?
另外请注意,我一直在尝试上面的3种变体:
用于评估的
使用
此外,使用基于表达式的版本可以重写表达式树,本质上是将所有分支内联到单个复合条件表达式中,而不是使用重复调用。我最近没有检查过,但在一些早期的实体框架构建中,我似乎记得这是必要的,因为它不太喜欢InvocationExpression。它还允许更有效地使用LINQ- to -Objects,因为它避免了重复的委托调用-测试显示,与等效的C#复合条件语句相比,上面的匹配(使用表达式形式)的执行速度要快一些。在完整性方面,基于Func<...>的版本花费的时间是C#条件语句的4倍,但仍然非常快,在大多数用例中不太可能成为主要的瓶颈。
我欢迎任何关于以上(或关于更丰富的C#语言支持的可能性)的想法/意见/批评/等等。希望如此;-p)。
https://stackoverflow.com/questions/156467
复制相似问题