参数是否有合并运算符?空值参数时如何简洁跳过方法调用?
解答:更简洁处理null时的方法调用
嘿,这个问题问得很实用!先澄清个小概念:你提到的?.是空条件成员访问运算符,而合并运算符是??(用来在null时取默认值)。不过核心需求我完全get到了——就是想在a为null时直接跳过方法调用,不用写冗长的条件判断,对吧?
针对你的场景,这里有两种更简洁的写法:
方案一:用扩展方法包装静态调用(最优雅)
如果MyFunc.F是频繁调用的静态方法,推荐给A类型加一个扩展方法,把静态调用转成实例方法的形式,这样就能直接用?.运算符了:
// 先定义扩展方法 public static class AExtensions { // 这里的ReturnType替换成MyFunc.F实际的返回类型 public static ReturnType InvokeF(this A a) { return MyFunc.F(a); } } // 调用时就可以这么写,和成员方法的写法完全一致! var obj = a?.InvokeF();
当a为null时,?.会直接返回null,不会执行InvokeF方法,完美满足你的需求。
方案二:模式匹配简化条件判断
如果不想加扩展方法,也可以用C# 7+支持的模式匹配语法,让原来的条件判断更简洁:
var obj = a is not null ? MyFunc.F((A)a) : null;
对比你原来的a == null ? null : MyFunc.F((A)a),写法更紧凑,可读性也更好。
补充说明
- 空条件运算符
?.只能直接用于成员方法/属性的调用,没办法直接给静态方法的参数做“null短路”,所以才需要上面的两种变通方案。 - 合并运算符
??在这里不适用,因为它的逻辑是“左边为null时取右边值”,但右边的MyFunc.F((A)a)会被先求值,如果a是null的话,强制转(A)a可能会出问题(除非A是可空值类型),而且也达不到“跳过方法调用”的目的。
内容的提问来源于stack exchange,提问作者Ian Warburton
相关产品推荐
相关产品推荐

