WEB开发网
开发学院软件开发C语言 稍加改进的Switch/Case扩展方法 阅读

稍加改进的Switch/Case扩展方法

 2010-09-30 21:05:29 来源:WEB开发网   
核心提示: 之所以将CaseRun与CaseReturn区别命名,而不是重载,稍加改进的Switch/Case扩展方法(4),是因为CaseReturn也有类似于CaseRun的重载,即第二个参数也是表达式的重载,只有当首次书写CaseReturn方法时,返回结果的类型才被定性,虽然CaseReturn的重

之所以将CaseRun与CaseReturn区别命名,而不是重载,是因为CaseReturn也有类似于CaseRun的重载,即第二个参数也是表达式的重载。

虽然CaseReturn的重载中要求传入的表达式要有返回值(Func<T,T>),而CaseRun的第二个参数不要求返回值(Action<T>),但是在传入单句的Lambda表达式的时候容易产生歧义。

比如表达式中执行了一个带有返回值的方法,由于单句Lambda表达式不需显式使用return关键字,所以编译器就不能确切推导出要执行的是哪一个重载,这样编译器就可能会抓狂,然后其视为最吻合的Func<T,T>形式重载,而编写者可能仅仅是想执行一下该方法,并不希望获取返回值并反映到结果中去。

(情景范例:在单句Lambda表达式中调用了对数据库执行SQL语句的方法,该方法会返回受影响的记录总数,而程序员可能是希望仅仅执行一下 SQL语句就好了,但恰巧此Switch()方法链的返回结果被推导为int类型,程序就将此表达式匹配到Func<T,T>形式重载,就这样糊里糊涂地让这个返回值影响到了最终的返回结果)

所以如果不区别命名的话,在第二个参数中通过单句Lambda表达式执行带有返回值的方法时,程序就会倾向按照Func<T,T>的形式来执行,如是这样的话,出现问题的可能性不大,但一旦赶巧出现歧义判定问题,就很烦人,而且很难查出来,故此我要保留这种区别命名的形式。

要点提示

在使用中,以上展示的各种方法及其重载都可以混搭使用,但需注意以下几点:

Default类方法仅允许在语句链的末端使用,但其后可以追加同类的多个方法。

确切的说应该是:Default类方法的后面不允许再使用Case类方法。

在Switch()之后,只有当首次书写CaseReturn方法时,返回结果的类型才被定性,此后的所有CaseReturn方法都将要遵从此类型。

上一页  1 2 3 4 5  下一页

Tags:稍加 改进 Switch

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接