稍加改进的Switch/Case扩展方法
2010-09-30 21:05:29 来源:WEB开发网因为在Switch()方法里没有显式声明任何类型,所以这个返回类型推导工作被延后到首次书写CaseReturn方法时完成。
Switch的有参数重载形式不具备此延迟推导特性。
如果一直没有书写CaseReturn方法,那么在书写DefaultRun方法后,方法链将结束,无法书写后续的方法链,也无法获取返回结果。
这个设计是很自然的,因为其后书写什么都没有什么实际意义了,这里提示出来就是怕不知道的人误以为是BUG。
不只是替代switch
由于这个Switch扩展方案支持传入表达式做判定和执行,所以它还完全可以用于替代if……else if……else语句,比如下面代码中,底部的那段代码与注释掉的那段代码就是等价的:
var str = "test";
var on=true;
var day = DateTime.Today;
//if (str.StartsWith("t") && on) str = "1";
//else if (str.Length > 9) str = "2";
//else if (str == "none") { str = "3"; on = false; }
//else if (day < DateTime.Now) str = "4";
//else on = false;
str.Switch()
.CaseRun(f => f.StartsWith("t") && on, f => str = "1")
.CaseRun(f => f.Length > 9, f => str = "2")
.CaseRun("none", f => { str = "3"; on = false; })
.CaseRun(f => day < DateTime.Now, f => str = "4")
.DefaultRun(f => on = false);
扩展的意义
这样的扩展除了让代码显得更复杂以衬托出作者之牛B深奥之外,还有什么优点?
优点就是能在单句Lambda表达式中使用,这样就能让你更深奥一层……
哈哈,玩笑,不只是单句Lambda表达式,在充当方法的参数时,三元表达式又不够用的情况下,这样的扩展就大有用武之地了,你可以不必大费周章地再去定义临时的变量并给它赋值,或者专门建立一个方法来解决这类简单的判别问题。
它的形式可能不算优雅,但它能够让你的代码结构变得优雅一些,并让你专注于解决手头的问题,而不是在代码页中上翻下抄瞎忙活。
总结
再次感谢鹤冲天给我们带来了那么多的启示,让我们一同将扩展方法发挥到淋漓尽致吧,这是我们自制的语法糖啊
更多精彩
赞助商链接