相关疑难解决方法(0)

开关/模式匹配的想法

我最近一直在关注F#,虽然我不太可能在不久的将来跳过障碍,但它肯定会突出一些C#(或库支持)可以让生活更轻松的领域.

特别是,我正在考虑F#的模式匹配功能,它允许非常丰富的语法 - 比当前的开关/条件C#等价物更具表现力.我不会试图给出一个直接的例子(我的F#不符合它),但简而言之它允许:

  • 按类型匹配(对受歧视的联合进行全覆盖检查)[注意这也推断了绑定变量的类型,给成员访问等]
  • 谓词匹配
  • 以上的组合(以及可能我不知道的其他一些场景)

虽然C#最终可以借用[ahem]丰富的一些内容,但是在过渡时期我一直在研究可以在运行时做些什么 - 例如,将一些对象拼凑起来相当容易:

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
Run Code Online (Sandbox Code Playgroud)

其中getRentPrice是Func <Vehicle,int>.

[注意 - 也许这里的Switch/Case是错误的术语......但它显示了这个想法]

对我来说,这比使用重复的if/else或者复合三元条件(对于非平凡的表达式变得非常混乱 - 括号丰富)的等价物要清楚得多.它还避免了大量的转换,并允许简单扩展(直接或通过扩展方法)到更具体的匹配,例如InRange(...)匹配可比VB选择...案例"x到y "用法.

我只是想测量一下,如果人们认为上述结构有很多好处(在没有语言支持的情况下)?

另外请注意,我一直在玩上述3种变体: …

c# switch-statement

148
推荐指数
7
解决办法
2万
查看次数

标签 统计

c# ×1

switch-statement ×1